栈
一、栈的基本概念
1、栈的定义
栈:只允许在一端进行删除和插入,是一种受限的线性表。又被称为后进先出(Last In First Out)的线性表,简称LIFO结构。
栈顶(top):线性表允许插入和删除的那一端
栈底(bottom):固定的,不允许插入和删除
空栈:不含任何元素的空表
2、栈的基本操作
初始化:InitStack(&s)
判空:EmptyStack(&s)
增:Push(&s, x)
删:Pop(&s, x)
查:GetTop(&s,x)
注:当n个不同元素入栈时,出栈元素不同排列组合数为
二、顺序栈
1、栈的顺序存储
采用顺序存储的栈成为顺序栈,它是由一组连续的存储结构来进行存储的,同时附设一个指针来表示当前栈顶元素的位置。若存储栈的长度为S.size(),则栈顶位置top必须小于S.size()。当栈中存在一个元素时,top=0,通常把空栈的判定条件为top=-1。
#define MAXSIZE 10000 //定义栈中元素的最大个数
typedef int ElemType;
typedef struct{
ElemType data[MAXSIZE];
int top;
}sqStack;
2、顺序栈的基本算法
(1)初始化
void InitStack(SqStack &S) {
S.top = -1;
};
(2)判栈空
bool EmptyStack(&s) {
if (top == -1)
return true;
else
return false;
};
(3)进栈
status Push(Sqstack *S, ElemTyp e) {
//判断栈是否已满
if (S.top == MaxSizxe - 1) {
return false;
}
S.data[++S.top] = e;
return true;
}
(4)出栈
status Push(Sqstack *S, ElemTyp *e) {
//判断栈是否为空
if (S.top == -1) {
return false;
}
S.data[S.top--] = e;
return true;
}
(5)查看栈顶元素
status Push(Sqstack *S, ElemTyp e) {
//判断栈是否为空
if (S.top == -1) {
return false;
}
*e = S.data[S.top];
return true;
}
3、共享栈
利用栈底位置相对不变的特征,两个顺序栈可以共同使用一个空间,将两个栈底分别设置在栈底,栈顶向中间延伸。
两个栈的栈顶指针都指向栈顶元素,top0=-1时0号栈为空,top0=MaxSize时1号栈为空。当top1=top0+1时判断为栈满。当0号栈每次有