一、栈的特性
我们从如上栈的示意图来讲一下栈的特性:
- 1.栈是
线性结构
中的一个限定性
数据结构,线性结构拥有的特性栈都拥有;- 2.栈的限定性特性是
只能由栈顶入栈和出栈
;- 3.栈的数据满足
先进后出
的原则。
二、栈的顺序存储的设计
1.数据准备
设计一些状态和类型重定义
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 20 /* 存储空间初始分配量 */
typedef int Status;
typedef int SElemType; /* SElemType类型根据实际情况而定,这里假设为int */
2.栈的设计
本文讲解的是顺序存储
,所以我们按顺序存储的方式设计
一个栈的结构
typedef struct
{
SElemType data[MAXSIZE];
int top; /*用于栈顶指针 */
}SqStack;
- 1.数组的内存是
连续
的,符合顺序存储
的特征,所以可以使用一个数组来保存栈的数据;- 2.
top
永远指向栈顶
。
三、初始化
Status InitStack(SqStack *S){
S->top = -1;
return OK;
}
数组的内存一但申请了,就会一直存在,初始化栈时,只需求将
栈顶top
指向-1
来表示栈为空
即可。
四、清空栈
Status ClearStack(SqStack *S){
//清空栈时,只需要标记栈顶为-1,就不会再访问栈中的任何数据了
S->top = -1;
return OK;
}
五、判断栈是否为空
Status StackEmpty(SqStack S){
if (S.top == -1)
return TRUE;
else
return FALSE;
}
栈顶top为
-1
即为空
,否则不为空
六、栈的长度
int StackLength(SqStack S){
return S.top + 1;
}
因为栈
为空
时top为-1,此时栈的长度为0
,top的最大值为MAXSIZE - 1
。
七、获取栈顶
Status GetTop(SqStack S,SElemType *e){
if (S.top == -1)
return ERROR;
else
e = S.data[S.top];
return OK;
}
- 1.栈顶top为-1时栈
为空
,没有栈顶;- 2.栈不为空时,直接取栈中
top位置
的数据;
八、入栈
Status PushData(SqStack *S, SElemType e){
//栈已满
if (S->top == MAXSIZE -1) {
return ERROR;
}
//栈顶指针+1;
S->top ++;
//将新插入的元素赋值给栈顶空间
S->data[S->top] = e;
return OK;
}
- 1.
栈满
时,不可继续插入;- 2.入栈时,将栈顶指针top
向上
移动一个位置,然后将入栈的数据放入移动后的栈顶位置。
九、出栈
Status Pop(SqStack *S,SElemType *e){
//空栈,则返回error;
if (S->top == -1) {
return ERROR;
}
//将要删除的栈顶元素赋值给e
*e = S->data[S->top];
//栈顶指针--;
S->top--;
return OK;
}
- 1.出栈前要判断栈是否为
空
,为空则不能出栈;- 2.无需对原来栈顶的数据进行处理,只需要将栈顶top
向下
移动一个位置,此时就不会再访问到原栈顶数据了。
十、遍历栈中数据
Status StackTraverse(SqStack S){
int i = 0;
printf("此栈中所有元素");
while (i<=S.top) {
printf("%d ",S.data[i++]);
}
printf("\n");
return OK;
}
栈中的数据是data中从
0~stop
位置的数据
十一、总结
栈的特性:先进后出
和栈顶出入栈
。