找回密码
 立即注册
首页 资源区 代码 数据结构:栈的基本概念、顺序栈、共享栈以及链栈 ...

数据结构:栈的基本概念、顺序栈、共享栈以及链栈

陶田田 2025-6-4 16:52:05
相关概念

栈(Stack)是只允许在一端进行插入或删除操作的线性表。
栈顶(Top):线性表允许插入删除的那一端。
栈底(Bottom):固定的,不允许进行插入和删除的另一端。
栈的基本操作

  • InitStack(&S):初始化一个空栈S。
  • StackEmpty(S):判断一个栈是否为空,若栈S为空则返回true,否则返回false。
  • Push(&S,x):进栈,若栈S未满,则将x加入使之成为新栈顶。
  • Pop(&S,&x):出栈,若栈S非空,则弹出栈顶元素,并用x返回。
  • GetTop(S,&x):读栈顶元素,但不出栈,若栈S非空,则用X返回栈顶元素。
  • DestoryStack(&S):销毁栈,并释放栈S所占用的存储空间。
栈的数学性质:当\(n\)个不同元素进栈时,出栈元素的不同排列的个数为\(C^n_{2n}/(n+1)\)。该公式称为卡特兰数(Catalan)公式,可采用数学归纳法证明。
顺序栈

采用顺序存储的栈称为顺序栈,它利用一组地址连续的存储单元存放自栈底到栈顶的数据元素,同时附设一个指针(top)指示当前栈顶元素的位置。
栈和队列的判空、判满条件,会因实际给的条件不同而变化;具体来说,有时候将空栈时栈顶指针初始化为-1,有时候将空栈时栈顶指针初始化为0.
  1. #define MaxSize 50
  2. typedef int Elemtype;
  3. typedef struct {
  4.         Elemtype data[MaxSize];
  5.         int top;
  6. } SqStack;
  7. void InitStack(SqStack& S) {
  8.         S.top = -1;
  9. }
  10. bool StackEmpty(SqStack S) {
  11.         if (S.top = -1)
  12.                 return true;
  13.         else
  14.                 return false;
  15. }
  16. bool Push(SqStack& S, Elemtype x) {
  17.         if (S.top == MaxSize - 1)
  18.                 return false;
  19.         S.data[++S.top] = x;
  20.         return true;
  21. }
  22. bool Pop(SqStack& S, Elemtype& x) {
  23.         if (S.top == -1)
  24.                 return false;
  25.         x = S.data[S.top--];
  26.         return true;
  27. }
  28. bool GetTop(SqStack& S, Elemtype& x) {
  29.         if (S.top == -1)
  30.                 return false;
  31.         x = S.data[S.top];
  32.         return true;
  33. }
复制代码
共享栈

利用栈底位置相对不变的特性,可让两个顺序栈共享一个一维数组空间,将两个栈的栈底分别设置在共享空间的两端,两个栈底向共享空间的中间延伸。
两个栈的栈顶指针都指向栈顶元素,top=-1时0号栈为空,top=MaxSize时1号栈为空;仅当两个栈顶指针相邻(top1-top0=1)时,判断为栈满。
  1. #define MaxSize 50
  2. typedef int Elemtype;
  3. typedef struct {
  4.         Elemtype data[MaxSize];
  5.         int top1;
  6.         int top2;
  7. } SqStack;
  8. void InitStack(SqStack& S) {
  9.         S.top1 = -1;
  10.         S.top2 = MaxSize;
  11. }
复制代码
链栈

采用链式存储的栈称为链栈,链栈的优点是便于多个栈共享存储空间和提高其效率,且不存在栈满上溢的情况。通常采用单链表实现,并规定所有的操作都是在单链表的表头进行的。一般规定链栈没有头结点,Lhead指向栈顶元素。
添加头结点对链栈的实现没有帮助,因此一般不设置头结点。
  1. #include <cstdlib>
  2. typedef int Elemtype;
  3. typedef struct LNode {
  4.         Elemtype data;
  5.         struct LNode* next;
  6. } LNode, *LiStack;
  7. void InitStack(LiStack& L) {
  8.         L = (LNode*)malloc(sizeof(LNode));        // 创建头节点
  9.         L->next = NULL;                                                // 头节点指向空
  10.         return;
  11. }
  12. bool StackEmpty(LiStack L) {
  13.         return L->next == NULL;
  14. }
  15. void Push(LiStack L, Elemtype x) {
  16.         LNode* node = (LNode*)malloc(sizeof(LNode));
  17.         node->data = x;
  18.         node->next = L->next;
  19.         L->next = node;
  20. }
  21. bool Pop(LiStack L, Elemtype& x) {
  22.         if (L->next = NULL)
  23.                 return false;
  24.         LNode* node = L->next;
  25.         x = node->data;
  26.         L->next = node->next;
  27.         free(node);
  28.         return true;
  29. }
  30. bool GetTop(LiStack L, Elemtype& x) {
  31.         if (L->next = NULL)
  32.                 return false;
  33.         x = L->next->data;
  34.         return true;
  35. }
复制代码
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册