目录
一、定义
只允许在一端进行插入或删除操作的线性表,即操作受限的线性表
重要术语:空栈(不含任何元素的栈)、栈顶(允许插入和删除的那一端)、栈底(不允许插入和删除的那一端)
特点:后进先出(体现在进出栈顺序)
二、基本操作
这里是线性存储
InitStack(&S) 初始化栈
DestoryStack(&S) 销毁栈
PushStack(&S,x) 入栈
PopStack(&S,&x) 出栈
GetTop(S,&x) 读栈顶元素(不修改栈顶元素)
StackEmpty(S) 判空
1.定义
在主存中开辟一段连续的空间用于存放元素,设置一个栈顶指针top用来表示栈顶的位置
#define Maxsize 10
typedef struct {
ElemType data[Maxsize]; //静态数组存放栈中元素
int top; //栈顶指针
}SqStack;
2.初始化
void InitSatck( SqStack &S) {
S.top = -1; //此时指向栈顶元素
/* S.top也可设置为0,此时指向栈顶元素的下一个位置*/
}
3.判空
bool StackEmpty(SqStack S) {
if ( S.top == -1)
/* 如果S.top初始化为0,则栈空条件为S.top == 0 */
return true;
else
return false;
}
4.进栈
void Push(SqStack &S, ElemType x) {
if (S.top == Maxsize-1) //栈满
/* 如果S.top初始化为0,则栈空条件为S.top == Maxsize */
return;
S.top = S.top+1; //指针加一
S.data[S.top] = x; //元素入栈
/* 这两行可以合并为 S.data[++S.top] = x; 表示先让指针加一,再进行存数据才操作 */
}
5.出栈
void Pop(SqStack &S, ElemType &x) {
if (S.top == -1) //栈空
return;
x = S.data[S.top]; //元素出栈
S.top = S.top-1; //指针减一
/* 这两行可以合并为 S.data[S.top--] = x; */
}
6.获取栈顶元素
与出栈类似,就是只取元素,没有栈顶指针后移的操作
int GetTop(SqStack S) {
if (S.top == -1) //栈空
return -1;
return S.data[S.top]; //元素出栈
}
7.打印
原理就是遍历出栈然后打印,但是出栈结果不会返回
void printStack(SqStack S){
while ( S.top != -1)
cout<< S.data[S.top--] <<;
}
C++的运行代码
#define Maxsize 30
typedef struct {
int data[Maxsize];
int top;
}SqStack;
void InitStack(SqStack &S)
{
S.top = -1;
}
bool Empty(SqStack S)
{
if(S.top == -1)
return true;
else
return false;
}
void Push(SqStack &S, int x)
{
if (S.top == Maxsize-1)
{
cout<<"栈满"<<endl;
return;
}
S.top += 1;
S.data[S.top] = x;
}
void Pop(SqStack &S, int &x)
{
if(S.top == -1)
{
cout<<"栈空"<<endl;
return;
}
x = S.data[S.top];
S.top -= 1;
}
void PrintStack(SqStack S)
{
while (S.top != -1)
{
cout<< S.data[S.top--] << " ";
}
}
int Gettop(SqStack S)
{
if (S.top == -1)
{
cout << "栈空"<<endl;
return -1;
}
return S.data[S.top];
}
int main()
{
SqStack S;
InitStack(S);
Push(S,1);
Push(S,2);
Push(S,3);
Push(S,4);
Push(S,5);
cout<<"存储完毕,此时栈中元素为:";
PrintStack(S);
cout<<endl;
cout<<"存储完毕,此时栈顶元素为:" <<Gettop(S)<<endl;
if(!Empty(S))
{
cout<<"栈不为空"<<endl;
}
int x;
Pop(S,x);
cout << x <<"出栈"<<endl;
cout<<"栈中剩余元素:";
PrintStack(S);
return 0;
}
运行截图:
三、 共享栈
两个栈共用一片空间,避免了内存资源的浪费,提高内存资源的利用率
#define Maxsize 10
//定义共享栈
typedef struct {
ElemType data[Maxsize]; //静态数组存放栈中元素
int top0; //0号栈栈顶指针
int top1; //1号栈栈顶指针
}ShStack;
//初始化
void InitSatck( ShStack &S) {
S.top0 = -1;
S.top1 = Maxsize;
}
//栈全空的条件: top0 == -1 && top1 ==Maxsize
//栈满的条件: top0+1 == top1
四、 链栈
只在单链表的头结点后进行增删改查操作就是栈的操作
/*详细操作可以参考单链表章节*/
五、常考题型(选择)
给你一个进栈顺序,问你有哪些合法的出栈顺序
结论:卡特兰数