栈的基本概念
栈的定义
栈(Stack)是只允许在一端进行插入或删除操作的线性表
- 栈顶:允许插入或删除的一端
- 栈底:不允许插入或删除的一端
- 空栈:没有元素的栈
栈的操作特点:后进先出(LIFO)
栈的基本操作
InitStack(&S):初始化栈。构造一个空栈 S,分配内存空间。
DestroyStack(&S):销毁栈。销毁并释放栈 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{
int data[MaxSize]; //静态数组存放栈中元素
int top; //栈顶指针
}SqStack;
顺序栈的初始化
初始top指针指向-1
/*初始化top=-1*/
void initSqStack(SqStack &S){
S.top = -1; //初始化栈顶指针
}
初始top指针指向0
/*初始化top=0*/
void initSqStack(SqStack &S){
S.top = 0; //初始化栈顶指针
}
顺序栈的判空
初始top指针指向-1
/*判空top=-1*/
bool isEmpty(SqStack S){
if(S.top == -1)
return true; //栈空
else
return false; //不空
}
初始top指针指向0
/*判空top=0*/
bool isEmpty(SqStack S){
if(S.top == 0)
return true; //栈空
else
return false; //不空
}
顺序栈进栈
初始化S.top = -1时
/*进栈(初始化S.top = -1)*/
bool Push(SqStack &S, int x){
if(top == MaxSize -1)
return false; //栈满,报错
S.top = S.top + 1;
S.data[S.top] = x;
//以上两语句等价于S.data[++S.top] = x;
return true;
}
初始化S.top = 0时
/*进栈(初始化S.top = 0)*/
bool Push(SqStack &S, int x){
if(top == MaxSize)
return false; //栈满,报错
S.data[S.top] = x;
S.top = S.top + 1;
//以上两语句等价于S.data[S.top++] = x;
return true;
}
顺序栈出栈
初始化S.top = -1时
/*出栈(初始化S.top = -1)*/
bool Pop(SqStack &S, int &x){
if(S.top == 1)
return false; //栈空,报错
x = S.data[S.top];
S.top = S.top - 1;
//以上两语句等价于x = S.data[S.top--];
return true;
}
初始化S.top = 0时
/*出栈(初始化S.top = 0)*/
bool Pop(SqStack &S, int &x){
if(S.top == 0)
return false; //栈空,报错
S.top = S.top - 1;
x = S.data[S.top];
//以上两语句等价于x = S.data[--S.top];
return true;
}
顺序栈读栈顶元素
初始化S.top = -1时
/*读栈顶元素(初始化S.top = -1)*/
bool GetTop(SqStack S, int &x){
if(S.top == -1)
return false; //栈空,报错
x = S.data[S.top]; //x记录栈顶元素
return true;
}
初始化S.top = 0时
/*读栈顶元素(初始化S.top = 0)*/
bool GetTop(SqStack S, int &x){
if(S.top == -1)
return false; //栈空,报错
x = S.data[S.top - 1]; //x记录栈顶元素
return true;
}
共享栈
共享栈:两个栈共享一片内存空间,两个栈从两头向中间增长
定义
#define MaxSize 10 //定义栈中元素个数的最大值
typedef struct{
int data[MaxSize]; //静态数组存放栈中元素
int top0; //0号栈栈顶指针
int top1; //1号栈栈顶指针
}ShStack;
初始化
void initShStack(ShStack &Sh){
Sh.top0 = -1; //初始化0号栈的栈顶指针
Sh.top1 = MaxSize;//初始化1号栈的栈顶指针
}
判满
bool isFull(ShStack Sh){
if( top0 + 1 =