顺序栈使用数组来存储栈中的元素,通过一个指针Top来标识栈顶位置。
顺序栈的存储结构
c
#define MAXSIZE 1024
typedef int DataType;
typedef struct {
DataType elements[MAXSIZE]; // 存储栈元素的数组
int Top; // 栈顶指针,指向栈顶元素的位置
} SequenStack;
/*
* MAXSIZE: 栈的最大容量
* DataType: 栈数据元素的数据类型
* Top: 指示当前栈顶位置,空栈时Top=-1
*/
顺序栈的基本操作
初始化空栈
c
SequenStack *SetNullS(SequenStack *S) {
S = (SequenStack*)malloc(sizeof(SequenStack));
S->Top = -1; // 空栈时Top为-1
return S;
}
判断栈空
c
int EmptyS(SequenStack *S) {
return (S->Top < 0) ? 1 : 0; // Top<0表示栈空
}
优化说明:使用三元运算符简化条件判断,提高代码可读性。
入栈操作
c
void PushS(SequenStack *S, DataType e) {
if (S->Top >= MAXSIZE - 1) {
printf("Stack Overflow: 栈已满,无法插入元素\n");
return;
}
S->Top++; // 栈顶指针上移
S->elements[S->Top] = e; // 在新的栈顶位置存入元素
}
时间复杂度:O(1)
出栈操作
c
DataType PopS(SequenStack *S) {
if (EmptyS(S)) {
printf("Stack Underflow: 栈为空,无法出栈\n");
return -1; // 返回错误值,实际应用中可抛出异常
}
DataType ret = S->elements[S->Top]; // 保存栈顶元素
S->Top--; // 栈顶指针下移
return ret;
}
时间复杂度:O(1)
读取栈顶元素
c
DataType GetTopS(SequenStack *S) {
if (EmptyS(S)) {
printf("Stack is empty: 无法读取栈顶元素\n");
return -1;
}
return S->elements[S->Top]; // 返回栈顶元素,不修改栈状态
}
时间复杂度:O(1)
顺序栈的优缺点
优点
- 随机访问:可以通过下标快速访问任意元素(虽然栈不允许)
- 空间效率高:没有额外的指针开销
- 实现简单:操作直观,易于理解和实现
缺点
- 空间固定:需要预先分配固定大小的存储空间
- 空间浪费:可能存在大量未使用的空间
- 溢出风险:当元素数量超过MAXSIZE时发生上溢