栈与队列

队列

队列只允许在表的一端进行插入,而在另一端删除元素。允许插入的一端称为队尾,允许删除的一端称为队头

在这里插入图片描述

  • 特点:先进先出的线性表

栈是限定仅在表尾进行插入或删除操作的线性表。表尾端称为栈顶,表头端称为栈底,不含元素的空表称为空栈

`栈有两种存储方式,分别为顺序栈和链栈
在这里插入图片描述
在这里插入图片描述

  • 特点:后进先出的线性表

栈的类型定义

  • InitStack(&S)
    构造一个空栈S

  • 在栈S已存在的情况下

  • DestroyStack(&S)
    销毁栈S

  • ClearStack(&S)
    将S清为空栈

  • StackEmpty(S)
    若栈S为空栈,则返回true,否则返回false

  • StackLength(S)
    返回S的元素个数,即栈的长度

  • GetTop(S)
    (S为非空)返回S的栈顶元素,不修改栈顶指针

  • Push(&S,e)
    插入元素e为新的栈顶元素

  • Pop(&S,&e)
    (S为非空)删除S的栈顶元素,并用e返回其值

  • StackTraverse(S)
    (S为非空)从栈底到栈顶依次对S的每个数据元素进行访问

顺序栈

顺序栈是指利用顺序存储结构实现的栈,即利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置,指针base指示栈底元素在顺序栈中的位置。当top和base的值相等或top=0时,表示空栈

define MAXSIZE 100  //顺序栈存储空间的初始分配量
typedef struct
{
  SElemType *base;  //栈底指针
  SElemType *top;  //栈顶指针
  int stacksize;  //栈可用的最大容量
}SqStack;

初始化完成后,栈底指针base始终指向栈底的位置,若base的值为NULL,则表明栈结构不存在。
栈空时,top和base的值相等,都指向栈底;栈非空时,top始终指向栈顶元素的上一个位置。

栈中元素和栈指针之间的关系:
在这里插入图片描述
部分操作的实现:

  • 初始化

顺序表初始化是为顺序栈动态分配一个预定义大小的数组空间

Status InitStack(SqStack &S)
{ //构造空栈S
  S.base=new SElemType[MAXSIZE];  //为顺序栈动态分配一个最大容量为MAXSIZE的数组空间
  if(!S.base) exit(OVERFLOW); //存储分配失败
  S.top=S.base;  //空栈
  S.stacksize=MAXIZE;  //stcksize置为栈的最大容量MAXSIZE
  return OK;
}
  • 入栈

入栈是在栈顶插入一个新元素

Status Push(SqStack &S,SElemType e)
{ //插入元素e为新的栈顶元素
  if(S.top-S.base==S.stacksize) return ERROR;//栈满
  *S.top++=e;  //元素e压入栈顶,栈顶指针加1
  return OK;
}
  • 出栈

出栈是删除栈顶元素

Status Pop(SqStack &S,SElemType &e)
{  //删除S的栈顶元素,用e返回其值
  if(S.top==S.base) return ERROR;  //栈空
  e=*--S.top;  //栈顶指针减1,将栈顶元素赋给e
  return OK;
}
  • 取栈顶元素

当栈非空时,此操作返回当前栈顶元素的值,栈顶指针保持不变

SElemType GetTop(SqStack S)
{  //返回S的栈顶元素,不修改栈顶指针
  if(S.top!=S.base)  //栈非空
    return *(S.top-1);  //返回栈顶元素的值,栈顶指针不变
}
  • 在应用程序无法先估计栈可能达到的最大容量时,应该使用链栈

链栈

链栈是采用链式存储结构实现的栈。通常链栈用单链表来表示。

链栈示意图:
在这里插入图片描述
部分操作的实现:

  • 初始化

链表初始化是构造一个空栈。因为没必要设头结点,所以直接将栈顶指针置空即可

Status InitStack(LinkStack &S)
{ //构造空栈S,栈顶指针置空
  S=NULL;
  return OK;
}
  • 入栈

和顺序栈的入栈操作不同的是,链栈在入栈前不需要判断栈是否满,只需要为入栈元素动态分配一个结点空间

链栈入栈过程:
在这里插入图片描述

Status Push(LinkStack &S, SElemType e)
{  //在栈顶插入元素e
  p=new StackNode;  //生成新结点
  p->data=e;  //将新结点数据域置为e
  p->next=S;  //将新结点插入栈顶
  S=p;  //修改栈顶指针为p
  return OK;
}
  • 出栈

和顺序栈一样,链栈在出栈前也需要判断栈是否为空,
不同的是,链栈在出栈后需要释放出栈元素的栈顶空间

链栈出栈过程:
在这里插入图片描述

Status Pop(LinkStack &S,SElemType &e)
{ //删除S的栈顶元素,用e返回其值
  if(S==NULL) return ERROR;  //栈空
  e=S->data;  //将栈顶元素赋给e
  p=S;  //用p临时保存栈顶元素空间,以备释放
  S=S->next;  //修改栈顶指针
  delete p;  //释放原栈顶元素的空间
  return OK;
}
  • 取栈顶元素

和顺序栈一样,当栈非空时,此操作返回当前栈顶元素的值,栈顶指针S保持不变

SElemType GetTop(LinkStack S)
{ //返回S的栈顶元素,不修改栈顶指针
  if(S!=NULL)  //栈非空
    return S->data;  //返回栈顶元素的值,栈顶指针不变
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值