栈的顺序存储及其基础操作
BB Time
上个学期数据结构专业课又双叒叕水过去了
到学期末我才发现我竟然连链表都没有自己敲过
所以这个假期第一件事就是把数据结构认认真真学一遍
一、栈
1、概念
栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
2、数据结构
typedef struct {
int TOP;//栈顶指针
int Data[MAX];//数据
} TypeStack;
3、功能函数
初始化栈:TypeStack *InitStack();
判满:int IfFull(TypeStack *Stack);//满返回1
判空:int IfEmpty(TypeStack *Stack);//空返回1
入栈:void Push(TypeStack *Stack);
出栈:int Pop(TypeStack * Stack);
打印栈:void Print(TypeStack *Stack);
二、栈基础功能
1、判空
(1)原理
初始化栈的时Stack->Top
值为-1
,每个元素入栈时Stack->Top
自增1。所以当Stack->Top
值为-1
时栈为空
(2)代码
int IfEmpty(TypeStack *Stack) {
if (Stack->TOP == -1)
return 1;
return 0;
}
2、判满
(1)原理
宏定义MAX
值为栈最大元素数。栈中的第一个元素从下标0开始,所以当Stack->Top
值为MAX-1
时,栈满
(2)代码
int IfFull(TypeStack *Stack) {
if (Stack->TOP == MAX-1)
return 1;
return 0;
}
3、入栈
(1)原理
如图,元素入栈时,元素填入栈顶,即数组中下标为Stack->Top
的一项——Stack->Data[Stack->Top]
。元素进入后,栈顶指示器上移一位
(2)代码
void Push(TypeStack *Stack) {
if (IfFull(Stack)) {
printf("\n!!!栈已满,无法入栈!!!\n");
return;
}
printf("输入待入栈的值;");
Stack->TOP++;
scanf("%d",&Stack->Data[Stack->TOP]);
}
4、出栈
(1)原理
栈中元素出栈时,用变量x
保存栈顶元素,栈顶指示器下移
(2)代码
int Pop(TypeStack *Stack) {
int x = Stack->Data[Stack->TOP];
Stack->TOP--;
return x;
}
三、两栈共享存储空间
1、原理
使用多个栈时可能会出现一个栈溢出,但是其他的栈还有多余空间的情况,这种情况如果可以把未满栈的空间给已满栈使用,就能进一步提高存储空间利用率。
实现起来比较简单。数组头尾两个端点分别表示两个栈的栈底——一个栈的栈底为数组始端,另一个栈的栈底为末端,两个栈元素入栈时Stack->Top
向数组中部延伸,只要两个栈顶指示器不碰面,就说明栈依旧未满,可以继续入栈
2、数据结构
typedef struct {
int Top1;
int Top2;
int Data[MAX];
}
2、源代码
(稍后上传到Github)
四、问题总结
1、宏定义
在定义栈的结构体时用到了宏定义MAX
表示栈中元素最大值
#define MAX 5
给宏定义赋值的时候不用=
!!!不用赋值号啊!