栈
栈的定义
栈(stack)是限定仅在表尾进行插入或者删除的线性表。对于栈来说,表尾端称为栈顶(top),表头端称为栈底(bottom)。不含任何数据元素的空表称为空栈。因为栈限定在表尾进行插入或者删除,所以栈又被称为后进先出的线性表(简称LIFO:Last in, First out.结构)。
顺序栈的基本操作
-
函数列表
-
Status InitStack(SqStack *S) 初始化栈
-
Status GetTopStack(SqStack *S, ElemType *e) 获取栈顶元素,参数e存放栈顶元素的值
-
Status PushStack(SqStack *S, ElemType e) 进栈,将元素e入栈
-
Status PopStack(SqStack *S, ElemType *e) 出栈,出栈的元素存放在参数e中
-
Status EmptyStack(SqStack *S) 判断栈是否为空
-
Status LengthStack(SqStack *S) 获取栈的实际长度
-
Status DestroyStack(SqStack *S) 销毁栈
-
Status StackTraverse(SqStack *S) 遍历栈,打印每个元素
2.代码实现 -
数据类型的确定
typedef struct {
ElemType *base; // 栈底指针
ElemType *top; // 栈顶指针
int stack_size; // 栈的最大长度
} SqStack;
- 初始化栈
// 初始化栈
Status InitStack(SqStack *S) {
// 分配初始空间
S->base = (ElemType *) malloc(Stack_Init_Size * sizeof(ElemType));
if (!S->base) {
exit(0);
}
S->top = S->base; /// 栈顶与栈底相同
S->stack_size = Stack_Init_Size; // 栈的最大长度等于初始长度
return 1;
}
- 判断栈是否为空
// 判断栈是否为空,只需要判断栈顶指针与栈底指针是否相同即可
Status EmptyStack(SqStack *S) {
return S->base == S->top;
}
- 栈的长度
// 获取栈的实际长度,栈顶减去栈底指针即为栈的长度
Status LengthStack(SqStack *S) {
if (S->top == S->base) {
return 0;
}
return (Status) (S->top - S->base);
}
- 获取栈顶元素
// 获取栈顶的元素,参数e用来存放栈顶的元素
Status GetTopStack(SqStack *S, ElemType *e) {
if (S->top == S->base) {
return 0;
}
*e = *(S->top - 1);
return 1;
}
- 进栈
// 进栈,参数e是要进栈的元素
Status PushStack(SqStack *S, ElemType e) {
// 若栈的最大长度不会够用时,重新开辟,增大长度
if (S->top - S->base >= S->stack_size) {
S->base = (ElemType *)realloc(S->base, (S->stack_size + StackIncrement) * sizeof(ElemType));
if (!S->base) {
return 0;
}
// 栈顶指针为栈底指针加上栈之前的最大长度
S->top = S->base + S->stack_size;
// 栈当前的最大长度等于栈之前的最大长度与增加的长度之和
S->stack_size += StackIncrement;
}
*S->top++ = e; // 先赋值,后栈顶指针上移
return 1;
}
- 出栈
// 出栈,参数e用来存放出栈的元素
Status PopStack(SqStack *S, ElemType *e) {
if (S->base == S->top) {
return 0;
}
*e = *--S->top; // 栈顶指针先下移,后赋值
return 1;
}
- 销毁栈
// 销毁栈,释放栈空间,栈顶栈底指针置为NULL,长度置为0
Status DestroyStack(SqStack *S) {
free(S->base);
S->base = S->top = NULL;
S->stack_size = 0;
return 1;
}
- 遍历栈
// 遍历栈,依次打印每个元素
Status StackTraverse(SqStack *S) {
ElemType *p;
if (S->top == S->base) {
printf("Stack is NULL.\n");
return 0;
}
p = S->top;
// 由栈顶依次向下遍历
while (p > S->base) {
p--;
printf("%d ", *p);
}
printf("\n");
return 1;
}