定义:栈(Stack)是允许在一端进行插入或删除操作的线性表。
栈顶(Top):线性表允许进行插入删除的那一端。
栈底(Bottom);固定的。不允许插入和删除的一端。
空栈:不含任何元素。
栈的数学性质:当n个不同元素入栈时,出栈元素不同排列顺序(1/(n+1))Cn 2n。
栈的顺序存储结构:(栈是一种操作受限的线性表)
顺序栈:
栈的顺序存储类型可描述为:
#define MaxSize 10 //定义栈中元素的最大个数
typedef struct{
ElemType data[MaxSize]; //存放栈中元素
int top; //栈顶指针
}SqStack;
//方法一
void InitStack(SqStact &S){
S.top = -1; //初始化栈顶指针
}
//判栈是否为空
bool StackEmpty(SqStack S){
if(S.top == -1){
return false; //栈空
}
else
return tuer;
}
//进栈操作
bool Push(SqStack &S,Elemtype x){
if(S.top == MaxSize - 1) //栈满.报错
return false;
S.data[++S.top]=x; //指针先加1,再进栈
return ture;
}
//出栈
bool Pop(SqStack &S,Elemtype x){
if(S.top == -1)
return false;
S.data[S.top--]=x; //先出栈,后-1
return ture;
}
//读栈顶元素
bool GetTop(SqStack S,Elemtype &x){
if(S.top == -1)
return false;
x=S.data[S.top]; //指针先加1,再进栈
return ture;
}
viod testStack(){
SqStack S; //声明一个顺序栈(分配空间)
InitStack(S);
.....
}
思考:若初始时Top=0,出栈进栈的操作如何?
bool Push(SqStack &S,Elemtype x){ //进栈
if(S.top == MaxSize)
return false;
S.data[S.top++]=x; //先进栈,后指针加1
return ture;
}
bool Pop(SqStack &S,Elemtype x){
if(S.top == 0)
return false;
S.data[--S.top]=x; //指针先-1,再出栈
return ture;
}
2.共享栈
#define MaxSize 10 //定义栈中元素的最大个数
typedef struct{
ElemType data[MaxSize]; //存放栈中元素
int top0; //0号栈顶指针
int top1; //1号栈顶指针
}SqStack;
//初始化
void InitStack(SqStack &S){
S.top0 = -1;
S.top1 = MaxSize;
}
栈满条件:top0+1=top1;
【注】:0号栈入栈时,top0先加1,再赋值;1号栈入栈时,top1先减1,再复值;
栈的链式存储结构:
进栈对应用头插法建立单列表
typedef struct Linknode{
Elemtype data; //数据域
struct Linknode *next;//指针域
}ListStack; //栈类型定义
void InintStack(ListStack &Lhead){
Lhead = NUll; //不带头节点
return ture;
}
//进栈
void Push(ListStack &Lhead,Elemtype x){
Linknode *q=(LinkList *)malloc(sizeof(ListStack));
q->data = x;
q->next = Lhead;
Lhead = q; //头指针指向新节点
return ture;
}
//出栈
void Pop(ListStack &Lhead,Elemtype &x){
x=Lhead->data;
Linknode *p=Lhead;
Lhead = Lhead->next;
free(p);
return ture;
}
viod testStack(){
ListStack Lhead;
InitStack(head);
.....
}