【数据结构,栈的复习】

栈的存储实现

顺序栈

顺序栈的定义(初始化)

#define MaxSize 10 //定义栈中最大元素的个数
typedef struct {
ElemType data[MaxSize];//静态数组存放栈中元素
int top;//栈顶指针,一般来说,栈顶指针记录的是数组元素的下标,也就是从零开始的
}SqStack;

分配好存储空间后,接下来进行初始化的操作。刚开始时由于数组中还没有存放元素,所以top指针的值为-1;
所以判断栈空,即为判断top指针的值是否为-1.
代码如下:

bool StackEmpty(SqStack S){
if (s.top ==-1)//栈空
  return true;
else        //不空
   return false;
}

顺序栈的基本操作(增删改查)

进栈操作:

//新元素入栈:
bool Push(SqStack &S,Elemtype x)
{
//先判断栈是否已满
if (S.top==MaxSize-1)
  return false;
 else
 {
 S.top =S.top+1;   //top指针先加一
 S.data [S.top]=x;//新元素入栈
 return true;
 }
/*
 S.top =S.top+1;   //top指针先加一
 S.data [S.top]=x;//新元素入栈
 还可以换成:
 S.data[++S.top]=x;
 注意
  S.data[S.top++]=x;是错误写法
  */

出栈操作:删除栈顶元素,并且使用变量x进行返回

bool Pop (SqStack &S,Elemtype &x)
{
//先判断栈是否为空
if (S.top ==1)
  return false;
else{
x=S.data[S.top];//栈顶元素先出栈
S.top =S.top-1;//指针再减一
return true;
}
/*注意此时,数据还残留在内存中,只是逻辑上被删除了
x=S.data[S.top]//栈顶元素先出栈
S.top =S.top-1;//指针再减一
等价于x=S.data[S.top--];

读取栈顶元素

//和出栈类似,知识不需要移动top指针,读取即可
bool Pop (SqStack &S,Elemtype &x)
{
//先判断栈是否为空
if (S.top ==1)
  return false;
else{
x=S.data[S.top];//栈顶元素先出栈
return true;
}

另一种方式:
以上栈的操作是基于top指针指向当前栈顶元素;
下面还用另一种实现方式:
让top指针指向下一个我们可以插入元素的位置
则代码如下:

bool StackEmpty(SqStack S){
if (s.top ==0)//栈空
  return true;
else        //不空
   return false;
}

如果是这样设计的话,以元素入栈为例,此时,需要先把x放到top指针此时算指向的位置,然后再让top指针加一,算以这种情况下应该是:

S.data[S.top++]=x;//注意前面进行对比

同理元素出栈则为:

x=S.data[--S.top];//注意前面进行对比

判断栈满:

S.top ==MaxSize;//注意前面进行对比

共享栈:
两个栈共享同一片空间:

#define MaxSize 10
typedef Struct{
ElemType data[MaxSize];//静态数组存放栈中元素
int top0;//0号栈栈顶指针
int top1;//1号栈栈顶指针
}ShStack;
//初始化栈:
void InitStack(ShStack &S)
{
S.top0=-1;
s.top1=MaxSize;
}
//栈满的条件:
//top0 + 1 == top1

在这里插入图片描述

链栈

链栈的实现

回顾,头插法建立单链表:
进栈和出栈操作对应于链栈的插入和删除操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值