目录
一、栈
*1.1定义
栈是只允许在一端进行插入和删除操作的线性表。
#define MaxSize 50
typedef struct{
int data[MaxSize]; //存放元素
int top; //栈顶指针
}SqStack;
栈顶:线性表允许进行插入删除的一端
栈底:固定的,不允许进行插入和删除的另一端
空栈:不含任务元素的空表
栈的数学性质:n个不同的元素进栈,出栈元素不同排列的个数为,公式称卡特兰(Catalan)数,
*1.2基本操作
根据从初始化的不同栈,操作细节也会不同
InitStack(&S):初始化一个栈S
S.top==-1
StackEmpty(S):判断一个栈是否为空,为空返回true,不空flase
S.top==-1
Push(&S,x):进栈,若栈S未满,x加入使之为新栈顶
S.data[++S.top]==x
Pop(&S,&x):出栈,若S非空,用x返回栈顶元素
x=S.data[S.top--]
GetTop(S,&x):读取栈顶元素,x返回栈顶元素
S.data[S.top]
DestroyStack(&S):销毁栈,并释放栈S占用的存储空间
二、共享栈
利用栈底位置相对不变的特性,可以让两个顺序栈共享一个一维数组空间,将两个栈底分别设置在共享栈的空间两端
0号栈 | 1号栈 | |
判空 | top0=-1 | top1=MaxSize |
判满 | top0+1=top1 | |
入栈 | S0.data[++S0.top]=x | S1.data[--S1.top]=x |
出栈 | S0.data[S0.top--] | S1.data[S1.top++] |
三、栈的链式存储结构
typedef struct Linknode{
int data; //数据域
Struct Linknode *next; //指针域
}*LiStack; //栈类型定义
*题
一个栈输入序列是1,2,3,...,n,输出的第一个序列是n,则第i个输出是元素是 n-i+1