1.定义
顺序栈是一种简单且常见的数据结构,常用于解决需要后进先出(LIFO)操作的问题,如递归函数调用、表达式求值、历史记录的管理等。由于其基于数组实现,栈的大小通常受限,所以在使用顺序栈时需要谨慎管理栈的容量,以避免栈溢出的情况。
2.顺序栈的定义包括以下几个关键要素:
-
存储结构:顺序栈使用数组作为其基本存储结构。这个数组通常是一个连续的内存块,可以容纳一定数量的元素。
-
栈顶指针:顺序栈使用一个指针来标识栈顶元素的位置。这个指针通常指向数组中最顶部的元素,或者指向栈顶元素上方的一个空位置,以便插入新元素。
-
栈的大小限制:顺序栈的大小通常是固定的,由数组的容量决定。一旦栈满,就无法再插入新的元素,除非进行一些特定的操作来扩展栈的容量。
3.基本操作:顺序栈通常支持以下基本操作:
- 入栈(Push):将元素放入栈顶,同时更新栈顶指针。
- 出栈(Pop):从栈顶移除元素,同时更新栈顶指针。
- 获取栈顶元素(Top):返回栈顶元素的值,但不移除它。
- 判空(Empty):检查栈是否为空。
- 判满(Full):检查栈是否已满。
- 获取栈的大小(Size):返回栈中元素的数量。
示意图:
特点:
1.栈顶指针通常指向栈顶元素上方的位置,或者指向栈顶元素本身。当进行入栈操作时,栈顶指针向上移动以指向插入的新元素。当进行出栈操作时,栈顶指针向下移动以移除栈顶的元素。
2.先进后出,后进先出。
案例:
1.1:初始化:创建一个空的数组,用来作为顺序栈
typedef int DataType;
typedef struct
{
DataType *data; /* 堆空间 */
int maxsize;
int top; /* 栈顶指针 */
}SeqStack;
/* 1. 初始化 */
int init(SeqStack *S, int MaxSize);
/* 1. 初始化 */
int init(SeqStack *S, int MaxSize)
{
/*申请内存空间*/
S->data = (DataType*)malloc(sizeof(DataType)*MaxSize);
if(!S->data)
{
printf("内存申请错误,初始化失败![10001]\n");
return 10001;
}
S->maxsize = MaxSize;
S->top = -1;
return 0;
}
运行图:
2.入栈:它用于将一个新元素添加到栈顶
有两个步骤:
2.1:首先判断栈是否已满
2.2:若栈未满,则将要入栈的元素放入数组中top的下一个位置,并将top加1。
/* 2. 进(入)栈 */
int push(SeqStack *S, DataType x);
/* 2. 进(入)栈 */
int push(SeqStack *S, DataType x)
{
/*是否满?*/
if(full(S))
{
printf("栈已满!10002\n");
return 10002;
}
S->top++; /*移动指针*/
S->data[S->top] = x;/*放入数据*/
return 0; /*OK*/
}
运行图:
运行图:
3.出栈:用于移除栈顶的元素。
有两个步骤:
3.1:首先判断栈是否为空
3.2:若栈非空,则将栈顶的元素取出,并将top减1。
/* 3. 出栈 */
int pop(SeqStack *S, DataType