栈之顺序栈(包含完整代码)C语言版

看一下关于栈的思维导图

在这里插入图片描述栈是只允许在一端进行插入或删除操作的线性表,按照物理结构的不同,栈又分为顺序栈和链栈。
本篇文章是顺序栈的专场。
在这里插入图片描述来看实现各个功能的代码块

//顺序栈的定义
#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;
}
  • 5
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值