看一下关于栈的思维导图
栈是只允许在一端进行插入或删除操作的线性表,按照物理结构的不同,栈又分为顺序栈和链栈。
本篇文章是顺序栈的专场。
来看实现各个功能的代码块
//顺序栈的定义
#define MaxSize 10 //定义栈中最大元素的个数
typedef struct{
elemtype data[MaxSize]; //静态数组存放栈中元素,销毁栈时不必手动释放空间
int top; //定义栈顶指针
}SqStack;
//初始化栈
void InitStack(SqStack &S){
S.top=-1;
}
void testStack(){
SqStack S; //声明一个顺序栈(分配空间)
InitStack(S);
}
//判空
bool StackEmpty(SqStack S){
if(S.top==-1) return true;
else return false;
}
//新元素入栈
bool Push(SqStack &S,elemtype x){
if(S.top==MaxSize-1) return false //栈满,报错
S.data[++S.top]=x; //指针先加1再让新元素入栈
return true;
}
//出栈操作
bool Pop(SqStack &S,elemtype &x){
if(S.top==-1) return false; //栈为空
x=S.data[S.top--];
return true;
}
//获取栈顶元素
bool GetTop(SqStack S,elemtype &x){
if(S.top==-1) return false; //栈为空
x=S.data[S.top];
return true;
}
顺序栈的缺点是栈的大小不能改变,也就是说顺序栈对空间的利用率不高,解决这一缺点除了使用链栈,还可以定义一种共享栈。
#define MaxSize 10
typedef struct{
elemtype data[MaxSize];
int top0; //0号栈顶指针
int top1; //1号栈顶指针
}ShStack;
//初始化栈
void InitStack(SqStack &S){
S.top0=-1;
S.top1=MaxSize;
}
完整代码如下:
#include <stdio.h>
#include <string.h>
#define MaxSize 10 //定义栈中最大元素的个数
typedef int elemtype;
typedef struct{
elemtype data[MaxSize]; //静态数组存放栈中元素,销毁栈时不必手动释放空间
int top; //定义栈顶指针
}SqStack;
//初始化栈
void InitStack(SqStack &S){
S.top=-1;
}
void testStack(){
SqStack S; //声明一个顺序栈(分配空间)
InitStack(S);
}
//判空
bool StackEmpty(SqStack S){
if(S.top==-1) return true;
else return false;
}
//新元素入栈
bool Push(SqStack &S,elemtype x){
if(S.top==MaxSize-1) return false; //栈满,报错
S.data[++S.top]=x; //指针先加1再让新元素入栈
return true;
}
//出栈操作
bool Pop(SqStack &S,elemtype &x){
if(S.top==-1) return false; //栈为空
x=S.data[S.top--];
return true;
}
//获取栈顶元素
bool GetTop(SqStack S,elemtype &x){
if(S.top==-1) return false; //栈为空
x=S.data[S.top];
return true;
}
void menu(){
printf("请选择要进行的操作[1-6]:\n");
printf("1.初始化顺序栈;\n");
printf("2.判断顺序栈是否为空;\n");
printf("3.入栈;\n");
printf("4.出栈;\n");
printf("5.获取栈顶元素;\n");
printf("0.退出。\n");
}
int main(){
SqStack S;
int choose;
elemtype x;
menu();
scanf("%d",&choose);
while(choose!=0){
switch(choose){
case 1:{
testStack();
printf("初始化成功!\n");
break;
}
case 2:{
bool f=StackEmpty(S);
if(f==true) printf("空栈!\n");
else printf("非空!\n");
break;
}
case 3:{
printf("请输入要入栈的元素:\n");
scanf("%d",&x);
if(Push(S,x)) printf("入栈成功!\n");
else printf("入栈失败!\n");
break;
}
case 4:{
if(Pop(S,x)) printf("元素%d出栈成功!\n",x);
else printf("出栈失败!");
break;
}
case 5:{
if(GetTop(S,x)) printf("栈顶元素为:%d\n",x);
else printf("获取失败!\n");
break;
}
default:{
printf("输入有误,请重新输入!\n");
break;
}
}
menu();
scanf("%d",&choose);
}
return 0;
}