一、栈的概念
栈:一种只允许在一端进行插入和删除的线性表,首先栈是一种线性表,但是这种线性表只能在一端进行删除和插入。
栈顶:允许插入删除一端 栈底:不允许插入删除。空栈不包括认识元素
操作特性:LIFO(后进先出)
n个元素进栈,出栈的数列顺序个数公式:
二、栈的基本操作:
初始化栈:initstack(&s)
判断栈空:Stackempty(s)
进栈:push(&s,key)
出栈:pop(&s,&e)删除并且返回栈顶元素
读取栈顶元素:Getpop:Gettop(S,&e);
销毁栈:destoryStack(&s) 销毁栈
三、栈的类别:存储方式不同:顺序栈 链表栈
顺序栈:用连续空间存储栈底到栈顶的元素,并且附加一个栈顶指针
typedef struct {
Elemtype data[maxsize];
int top;
}Sqtack;
栈顶指针为 S.top 初始化设置为-1(当前的存储位置) 栈顶元素:s.tada[S.top]
进栈操作:栈不满,栈顶指针加1,添加元素到栈顶
出栈操作:栈非空,先取值,在把栈顶元素减1
栈空条件:s.top==-1 栈满条件:s.top=maxsize-1 栈长:s.top+1
区别:初始化 s.top=0;(top指向下一个存储位置)
基本操作实现:
1.初始化栈:初始化栈顶指针
void intiStack(&s){
s.top=-1;
}
2.判断空:判断头指针是否为-1
bool EmptyStack(SqStack &s){
if(s.top==-1)
return ture; //空
else
return false;
}
3.进栈:判断栈不满,指针+1 ,赋值
bool push(SqStack &s,int e){
if(s.top!=Maxsize-1)
s.top=s.top+1;
s.data[top]=e;
return true;
return false;
}
4.出栈:栈不空,赋值,指针-1
bool pop(SqStack &s,int &key){
if(s.top!=-1)
key=s.data[top];
s.top=s.top-1;
return true;
return false;
}
5.读取栈顶元素 不空读取
bool Gettop(Sqstack s,int &key){
if(s.top!=-1)
key=data[top];
return true;
return false;
}
共享栈
定义:利用栈底位置相对不变,一个数组分为两个栈,两个栈从栈底分别向中间拓展
初始化:top0=0 top1=maxsize-1
添加元素:top0端+1,在赋值,top1端-1,在赋值
栈满条件:top1-top0=1
存取时间复杂度 o(1)
链式存储
优点:便于多个栈共享存储空间,不存在溢满
操作都是在没有头结点的链表进行Lhead指向栈顶元素