18.11.17
什么是栈
栈是一种只限定在表尾进行插入和删除的线性表,这里的表尾指的是栈顶,而不是栈尾,所以栈又被称为先进后出的线性表,也就是说栈是一个类似于木桶之类存在,先放进去的后拿出来
我们通常用一个变量top来标志栈顶元素的变化,若栈的长度为StackSize,那么top的值就必须小于StackSize,例如,当栈中只有一个元素时,top等于0,当栈中没有元素时,即栈为空栈,top等于-1
顺序存储结构离不开数组
既然是顺序存储结构实现栈,自然少不了数组出席,这可比链式简单多了,先定义个栈的结构,其形式跟线性表的顺序存储结构真的很像,非常非常像,线性表里边是有一个数组加一个整型变量存长度,而顺序栈里边是一个数组加一个整型变量top存栈尾的位置,代码如下
结构定义
typedef struct{
SElemType data[MaxSize];//存数据的数组
int top;//标记变量,记录表尾的变化
}SqStack;//将栈的类型命名为SqStack
栈初始化
跟顺序存储实现的线性表很像,它是使线性表的长度length等于0,而在栈这边,是使top等于-1(栈空时top==-1)
void CreateStack(SqStack *S){
if(!S)
printf("内存分配失败");
S->top=-1;
}
入栈(压栈)函数
在栈还不是满的情况下,每进一个元素,top加一
int Push(SqStack *S,SElemType e){//压栈函数,先进去的元素在数组里边,也就是数组前端
if(S->top==MaxSize-1)//如果栈满了
return 0;
S->top++;
S->data[S->top]=e;
return 1;
}
出栈函数
有进就得有出,出栈函数要求我们将弹出的元素保存下来,在栈不空的情况下,将弹出元素赋给一个指针,然后top减1
int Pop(SqStack *S,SElemType *e){//出栈,成功返回1,失败返回0
if(S->top==-1){//判断栈是否为空
printf("栈已空");
return 0;
}
*e=S->data[S->top];
S->top--;
return 1;
}
注意
以上的入栈和出栈函数均未涉及任何循环
所以时间复杂度为O(1)
打印函数
我们不知道栈里面的情况折腾的怎么样了,需要一个打印函数来查看,很简单,将栈中的数组打印出来就好了
int PrintStack(SqStack S){//打印函数
int i;
for(i=0;i<S.top+1;i++){//遍历数组,逐个打印
printf("%d ",S.data[i]);
}
printf("\n");
return 1;
}
这样栈的一些基本操作就完成了,我们把它组合到一个程序里面试试
源程序调试
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 20
typedef int SElemType;//令int 是SElemType
//对栈结构进行定义
typedef struct{
SElemType data[MaxSize];
int top;//标记变量,记录表尾的变化
}SqStack;
//函数声明
void CreateStack(SqStack *S);
int Push(SqStack *S,SElemType e);
int Pop(SqStack *S,SElemType *e);
int PrintStack(SqStack S);
int main(){//主函数调试
SqStack S;
int i,elem;
CreateStack(&S);
for(i=0;i<10;i++){
Push(&S,i);
}
printf("此时栈中元素为");
PrintStack(S);
for(i=0;i<11;i++){
printf("弹出一个数,此时栈为: ");
Pop(&S,&elem);
PrintStack(S);
}
}
void CreateStack(SqStack *S){
if(!S)
printf("内存分配失败");
S->top=-1;
}
int Push(SqStack *S,SElemType e){//压栈函数,先进去的元素在数组里边,也就是数组前端
if(S->top==MaxSize-1)//如果栈满了
return 0;
S->top++;
S->data[S->top]=e;
return 1;
}
int Pop(SqStack *S,SElemType *e){
if(S->top==-1){
printf("栈已空");
return 0;
}
*e=S->data[S->top];
S->top--;
return 1;
}
int PrintStack(SqStack S){
int i;
for(i=0;i<S.top+1;i++){
printf("%d ",S.data[i]);
}
printf("\n");
return 1;
}
调试结果如下