王道-考研-数据结构-栈【stack】
2022/9/10 23:24:53
本文主要是介绍王道-考研-数据结构-栈【stack】,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
栈和队列
三要素:
- 逻辑结构
- 数据的运算
- 存储结构(物理结构)
栈和队列都是操作受限的线性表。
1.1. 定义
栈是只允许在一端进行插入或删除操作的线性表。
- 栈顶:允许插入和删除的一端。
- 栈底:不允许插入和删除的一端。
- 空栈
- 栈顶元素
- 栈底元素
进栈顺序:
\[a_1->a_2->a_3->a_4->a_5 \]出栈顺序:
\[a_5->a_4->a_3->a_2->a_1 \]后进先出,Last In First OUT(LIFO)
1.2. 基本操作
InitStack(&S)
:初始化栈。构造一个空栈 \(S\),分配内存空间。DestroyStack(&S)
:销毁栈。销毁并释放栈 \(S\) 所占用的内存空间。Push(&S, x)
:进栈。若栈 \(S\) 未满,则将 \(x\) 加入使之成为新栈顶。Pop(&S, &x)
:出栈,若栈 \(S\) 非空,则弹出栈顶元素,并用 \(x\) 返回。GetTop(S, &x)
:读栈顶元素。若栈 \(S\) 非空,则用 \(x\) 返回栈顶元素。StackEmpty(S)
:判断一个栈 \(S\) 是否为空。若 \(S\) 为空,则返回true
,否则返回false
。
\(n\) 个不同的元素进栈,出栈元素的不同排列的个数为:
\[\frac{1}{n+1} C^{n}_{2n} \]上述公式称为 卡特兰(Catalan)数。可采用数学归纳法证明(不要求掌握)。
\[\frac{1}{5+1} C^{5}_{10} =\frac{10 \times 9 \times 8 \times 7 \times 6}{6 \times 5 \times 4 \times 3 \times 2 \times 1} =42 \]栈
1. 顺序栈
1.1. 定义
用顺序存储方式实现的栈。
#define MaxSize 10 typedef struct { ElemType data[MaxSize]; int top; // 栈顶指针 } SqStack;
\(MaxSize*sizeof(ElemType)+4B\)
1.2. 初始化栈
// 初始化栈 void InitStack(SqStack &S) { S.top = -1; }
// 判断栈空 bool StackEmpty(SqStack S) { return S.top == -1; }
// 判断栈满 bool StackFull(SqStack S) { return S.top == MaxSize - 1; }
1.3. 进栈
// 进栈 bool Push(SqStack &S, int x) { if (StackFull(S)) { return false; } // S.top++; // S.data[S.top] = x; S.data[++S.top] = x; return true; }
1.4. 出栈
// 出栈,数据还残留在内存中,只是逻辑上被删除了 bool Pop(SqStack &S, int &x) { if (StackEmpty(S)) { return false; } // x = S.data[S.top]; // S.top--; x = S.data[S.top--]; return true; }
1.5. 获取栈顶元素
// 读取栈顶元素 bool GetTop(SqStack &S, int &x) { if (StackEmpty(S)) { return false; } x = S.data[S.top]; return true; }
1.6. 另一种初始化栈的方式
// 初始化栈 void InitStack(SqStack &S) { S.top = 0; }
// 判断栈空 bool StackEmpty(SqStack S) { return S.top == 0; }
// 判断栈满 bool StackFull(SqStack S) { return S.top == MaxSize; }
1.7. 顺序栈的缺点
栈的大小不可改变。
1.8. 共享栈
两个栈共享同一片内存空间,两个栈从两边往中间增长。
#define MaxSize 10 typedef struct { ElemType data[MaxSize]; int top0; int top1; } ShStack;
// 初始化共享栈 void InitStack(ShStack &S) { S.top0 = -1; S.top1 = MaxSize; }
// 判断栈满 bool StackFull(ShStack S) { return S.top0 + 1 == S.top1; }
2. 链栈
2.1. 定义
typedef struct LNode { ElemType data; struct LNode *next; } LNode, *LinkStack;
2.2. 初始化
// 初始化一个链栈,带头结点 bool InitStack(LinkStack &S) { S = (LNode *)malloc(sizeof(LNode)); if (S == NULL) { return false; } S->next = NULL; return true; }
// 判断栈空 bool StackEmpty(LinkStack S) { return S->next == NULL; }
2.3. 进栈
// 进栈 bool Push(LinkStack &S, int x) { LNode *s = (LNode *)malloc(sizeof(LNode)); s->data = x; s->next = S->next; S->next = s; return true; }
2.4. 出栈
// 出栈 bool Pop(LinkStack &S, int &x) { if (StackEmpty(S)) { return false; } LNode *q = S->next; x = q->data; S->next = q->next; free(q); return true; }
2.5. 获取栈顶元素
// 读取栈顶元素 bool GetTop(LinkStack &S, int &x) { if (StackEmpty(S)) { return false; } x = S->next->data; return true; }
这篇关于王道-考研-数据结构-栈【stack】的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-27文件掩码什么意思?-icode9专业技术文章分享
- 2024-12-27如何使用循环来处理多个订单的退款请求,代码怎么写?-icode9专业技术文章分享
- 2024-12-27VSCode 在编辑时切换到另一个文件后再切回来如何保持在原来的位置?-icode9专业技术文章分享
- 2024-12-27Sealos Devbox 基础教程:使用 Cursor 从零开发一个 One API 替代品 审核中
- 2024-12-27TypeScript面试真题解析与实战指南
- 2024-12-27TypeScript大厂面试真题详解与解析
- 2024-12-26怎么使用nsenter命令进入容器?-icode9专业技术文章分享
- 2024-12-26导入文件提示存在乱码,请确定使用的是UTF-8编码怎么解决?-icode9专业技术文章分享
- 2024-12-26csv文件怎么设置编码?-icode9专业技术文章分享
- 2024-12-25TypeScript基础知识详解