栈:
是只允许在一端进行插入或删除操作的线性表
特点:
后进先出
基本操作:
InitStack(&S):初始化栈。构造一个空栈S,分配内存空间。
DestroyStack(&L):销毁栈。销毁并释放栈S所占用的内存空间
Push(&S,x):进栈,若栈S未满,则将x加入使之成为新栈顶
Pop(&S,&x):出栈,若栈s非空,则弹出栈顶元素,并用x返回
GetTop(S,&x):读栈顶元素。若栈S非空,则用x返回栈顶元素
StackEmpty(S):判断一个栈s是否为空。若s为空,则返回true,否则返回false
栈的出栈排列:
n个不同元素进栈,出栈元素不同排列的个数为
顺序栈的定义
//定义栈中元素的最大个数
#define MaxSize 10
typedef struct {
ElemType data[MaxSize]; //静态数组存放栈中元素
int pop; //栈顶指针
}SqStack;
void testStack() {
SqStack S; //声明一个顺序栈(分配空间)
}
bool StackEmpty(SqStack S) {
if (S.pop == -1)
return true; //为空
else
return false; //不空
}
进栈操作:
bool Push(SqStack& S, ElemType x) {
if (S.top == MaxSize - 1) //栈满,报错
return false;
S.top = S.top + 1; //指针先加1
S.data[S.top] = x; //新元素入栈
return true;
}
出栈操作:
bool Pop(SqStack& S, ElemType& x) {
if (S.top == -1) //栈空,报错
return false;
x = S.data[S.top]; //栈顶元素先出栈
S.top = S.top - 1; //指针再减1
return true;
}
读栈顶元素
//读栈顶元素
bool GetTop(SqStack S, ElemType& x) {
if (S.top == -1) //栈空,报错
return false;
x = S.data[S.top]; //x记录栈顶元素
return true;
}
共享栈
#define MaxSize 10
typedef struct {
ElemType data[MaxSize];
int top0; //0号栈栈顶指针
int top1; //1号栈栈顶指针
}ShStack;
void InitStack(ShStack& S) {
S.top0 = -1; //初始化栈顶指针
S.top1 = MaxSize;
}
栈满的条件:top0+1 == top1