数据结构——顺序栈与链式栈的实现-1

简介: 数据结构——顺序栈与链式栈的实现

一、概念

1、栈的定义

 栈 是仅限在 表尾 进行 插入 和 删除 的 线性表。

 栈 又被称为 后进先出 (Last In First Out) 的线性表,简称 LIFO 。


2、栈顶

 栈 是一个线性表,我们把允许 插入 和 删除 的一端称为 栈顶。

c4e9151013f1a98ed6d51d0b39c353fc_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1doZXJlSXNIZXJvRnJvbQ==,size_1,color_FFFFFF,t_70#pic_center.png


3、栈底

 和 栈顶 相对,另一端称为 栈底,实际上,栈底的元素我们不需要关心。

37f7fc3f3a30e530415c5499036e08d4_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1doZXJlSXNIZXJvRnJvbQ==,size_1,color_FFFFFF,t_70#pic_center.png


二、接口

1、可写接口

1)数据入栈

 栈的插入操作,叫做 入栈,也可称为 进栈、压栈。如下图所示,代表了三次入栈操作:

image.gif


2)数据出栈

 栈的删除操作,叫做 出栈,也可称为 弹栈。如下图所示,代表了两次出栈操作:

image.gif


3)清空栈

 一直 出栈,直到栈为空,如下图所示:

image.gif


2、只读接口

1)获取栈顶数据

 对于一个栈来说只能获取 栈顶 数据,一般不支持获取 其它数据。


2)获取栈元素个数

 栈元素个数一般用一个额外变量存储,入栈 时加一,出栈 时减一。这样获取栈元素的时候就不需要遍历整个栈。通过 �(1)O(1) 的时间复杂度获取栈元素个数。


3)栈的判空

 当栈元素个数为零时,就是一个空栈,空栈不允许 出栈 操作。


三、栈的基本运算

创建空栈 : CreateStack (len)


清空栈 : ClearStack (S)


判断是否栈空 : EmptyStack (S)


判断是否栈满 : FullStack (S)


元素进栈 : PushStack (S,x)


元素出栈 : PopStack (S)


取栈顶元素 : GetTop (S)


四、顺序栈Sequential Stack)实现

1、数据结构定义

对于顺序表,在 C语言 中表现为 数组,在进行 栈的定义 之前,我们需要考虑以下几个点:

 1)栈数据的存储方式,以及栈数据的数据类型;

 2)栈的大小;

 3)栈顶指针;


  • 我们可以定义一个 栈 的 结构体,C语言实现如下所示:
typedef int datatype;
typedef struct node{     /*定义栈中数据元素的数据类型*/
  datatype *data;      /*用指针指向栈的存储空间*/
  int maxlen;          /*当前栈的最大元素个数*/
  int top;             /*指示栈顶位置(数组下标)的变量*/
}sqstack;                /*顺序栈类型定义*/

2、创建栈

C语言实现如下所示:

sqstack* stack_create(int len)
{
  sqstack *s;
 
  if((s=(sqstack *)malloc(sizeof(sqstack)))==NULL)
  {
    puts("malloc failed");
    return NULL;
  }
  if((s->data=(datatype *)malloc(len*sizeof(datatype)))==NULL)
    
  {
    puts("malloc failed");
    return NULL;
  }
  s->maxlen=len;
  s->top=-1;
 
  return s;
}


3、清空栈

C语言实现如下所示:

void stack_clear(sqstack* s)
{
  s->top = -1;
}

4、判断栈是否为空

C语言实现如下所示:

int stack_empty(sqstack* s)
{
  return (s->top==-1 ? 1:0);
}

5、判断栈是否饱和

C语言实现如下所示:

int stack_full(sqstack* s)
{
  return (s->top==(s->maxlen-1) ? 1:0);
}

6、入栈

C语言实现如下所示:


int stack_push(sqstack* s,datatype value)
{
  if(s->top==s->maxlen-1){
    puts("stack is full");
    return -1;
  }
 
  s->data[s->top+1]=value;
  s->top++;
 
  return 1;
}


数据结构——顺序栈与链式栈的实现-2

https://developer.aliyun.com/article/1507981


相关文章
|
5天前
|
算法 C语言 C++
【practise】栈的压入和弹出序列
【practise】栈的压入和弹出序列
|
3天前
栈的几个经典应用,真的绝了
文章总结了栈的几个经典应用场景,包括使用两个栈来实现队列的功能以及利用栈进行对称匹配,并通过LeetCode上的题目示例展示了栈在实际问题中的应用。
栈的几个经典应用,真的绝了
|
4天前
|
存储 网络协议 Linux
用户态协议栈06-TCP三次握手
用户态协议栈06-TCP三次握手
|
4天前
|
存储
全局变量和局部变量在堆和栈的区别
全局变量和局部变量在堆和栈的区别
9 0
|
4天前
|
存储 人工智能 运维
高质量存储力发展问题之浪潮信息发布的大模型智算软件栈的定义如何解决
高质量存储力发展问题之浪潮信息发布的大模型智算软件栈的定义如何解决
8 0
|
5天前
|
设计模式 算法 C语言
【CPP】栈、双端队列、队列、优先级队列与反向迭代器
【CPP】栈、双端队列、队列、优先级队列与反向迭代器
|
5天前
|
存储 算法 C++
【CPP】栈简介及简化模拟实现
【CPP】栈简介及简化模拟实现
|
5天前
【数据结构】用栈实现队列
【数据结构】用栈实现队列
|
5天前
【数据结构】用队列实现栈
【数据结构】用队列实现栈
|
5天前
【数据结构】栈
【数据结构】栈