顺序栈
基本概念
顺序栈是一种基于数组实现的栈结构,利用连续的内存空间存储数据,遵循"后进先出"(LIFO)原则。栈顶指针(通常为top)动态指向当前栈顶元素的位置,支持压栈(push)和弹栈(pop)操作。
核心特性
- 存储结构:通过数组实现,需预先分配固定大小的内存空间。
- 栈顶指针 :初始值为
-1(空栈),插入元素时top递增,删除时递减。 - 时间复杂度:压栈和弹栈操作的时间复杂度均为O(1)。
cpp
#include <stdio.h>
// 考研标准:栈的最大容量(可根据题目修改)
#define MaxSize 50
// 顺序栈结构体定义(考研必考写法)
typedef struct {
// 静态数组存放栈元素
int data[MaxSize];
// 栈顶指针:指向栈顶元素(考研最常用定义方式)
int top;
} SqStack;
// 1. 初始化栈(核心)
void InitStack(SqStack *S) {
// 栈顶指针置为-1,表示空栈
S->top = -1;
}
// 2. 判断栈是否为空
int StackEmpty(SqStack S) {
// 栈顶为-1 → 空栈,返回1;否则返回0
return S.top == -1;
}
// 3. 判断栈是否为满
int StackFull(SqStack S) {
// 栈顶指向最后一个元素 → 栈满,返回1
return S.top == MaxSize - 1;
}
// 4. 入栈操作(进栈)
int Push(SqStack *S, int e) {
// 栈满,入栈失败
if (StackFull(*S))
return 0;
// 栈顶指针先+1,再赋值
S->data[++S->top] = e;
// 入栈成功
return 1;
}
// 5. 出栈操作(删除栈顶元素,用e返回值)
int Pop(SqStack *S, int *e) {
// 栈空,出栈失败
if (StackEmpty(*S))
return 0;
// 先取栈顶元素,栈顶指针再-1
*e = S->data[S->top--];
// 出栈成功
return 1;
}
// 6. 取栈顶元素(不删除)
int GetTop(SqStack S, int *e) {
// 栈空,取元素失败
if (StackEmpty(S))
return 0;
*e = S.data[S.top];
// 取元素成功
return 1;
}
// 7. 销毁栈(静态栈无需free,仅重置指针即可)
void DestroyStack(SqStack *S) {
S->top = -1;
}
// 主函数:测试栈的所有操作(考研答题可写可不写,建议写上)
int main() {
// 定义一个栈
SqStack S;
// 初始化栈
InitStack(&S);
// 测试入栈
Push(&S, 10);
Push(&S, 20);
Push(&S, 30);
printf("入栈元素:10,20,30\n");
// 测试取栈顶
int topElem;
GetTop(S, &topElem);
printf("当前栈顶元素:%d\n", topElem);
// 测试出栈
int e;
Pop(&S, &e);
printf("出栈元素:%d\n", e);
GetTop(S, &topElem);
printf("出栈后栈顶元素:%d\n", topElem);
// 测试判空
if (StackEmpty(S))
printf("栈为空\n");
else
printf("栈不为空\n");
// 销毁栈
DestroyStack(&S);
return 0;
}