顺序栈的基本操作

/*
*@author zhazhazhi
*qq:2055418639
*github:zhazhazhi7
*/

顺序栈

什么是顺序栈

顺序栈是指利用顺序存储结构实现的栈,即利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置。

顺序栈的定义

栈需要一个bottom指针做栈底,需要一个top指针做栈顶,需要一个size来做栈的长。

typedef struct LStack{
	int size;
	int *top;
	int *bottom;
}LStack;//定义栈 

顺序栈的初始化

*注:本博客的top总是指向下一个空栈,所有的访问栈顶都需要指针下移一位

栈的初始化需要将栈顶与栈底指针放在一起,当压栈的时候指针再向下走一位,size为栈的长度,不是栈底到栈顶的长度

int initStack(LStack &s){
	s.bottom = (int *)malloc(MAXIN*sizeof(int));
	if(!s.bottom){
		cout<<"地址分配失败"<<endl;
		return 0;
	}
	s.top = s.bottom;
	s.size = MAXIN;
	cout<<"初始化成功"<<endl;
	return 0;
}//初始化栈 

栈的地址依然用动态地址分配

顺序栈的压入

顺序栈的压入需要将栈顶指针向上移动,这个时候需要先判断栈顶指针是否到达最远,及top指针是否为空(前面定义栈时已经给了栈的大小size。栈顶指针在赋值后要继续指向下一位。

int Push(LStack &s,ElemType e){
	if(!s.top){
		cout<<"栈满"<<endl;
		return 0;
	}
	*(s.top)=e;
	s.top++;
//	cout<<"压栈成功"<<endl;
	return 0;
}//压栈 

顺序栈的弹出

弹出时依然需要做判空处理,即判断是否top==bottom——栈空,同时也用来判断栈顶指针是否需要继续下移一位。

int Pop(LStack &s){
	if(s.top==s.bottom){
		cout<<"栈空"<<endl;
		return 0;
	}
	s.top--;
	cout<<"弹出成功"<<endl;
	return 0; 
}//弹栈

顺序栈取顶

取栈顶元素是比较重要的操作,可以方便我们判断操作是否正确执行,或者程序是否按我们的想法在运行。

ElemType GetTop(LStack s){
	ElemType e;
	if(s.top==s.bottom){
		cout<<"栈已空"<<endl;
		return 0;
	}
	e = *(s.top-1);
	cout<<"现在的栈顶元素为:"<<e<<endl;
	return e;
}//获得栈顶元素 

完整代码演示

#include<bits/stdc++.h>

using namespace std;

#define MAXIN 20

typedef int ElemType;
typedef struct LinkStack{
	int *top;
	int *bottom;
	int size;
}LinkStack;//定义链式栈 

int InitStack(LinkStack &s){
	s.bottom = (int *)malloc(MAXIN*sizeof(int));
	if(!s.bottom){
		cout<<"地址分配失败"<<endl;
		return 0;
	}
	s.top = s.bottom;
	s.size = MAXIN;
	cout<<"初始化成功"<<endl;
	return 0;
}//初始化链式栈 

int Push(LinkStack &s,ElemType e){
	if(!s.top){
		cout<<"栈满"<<endl;
		return 0;
	}
	*s.top = e;
	s.top++;
	cout<<"压入成功"<<endl;
	return 0;
}//压入 

int Pop(LinkStack &s){
	if(s.top == s.bottom){
		cout<<"栈空"<<endl;
		return 0; 
	}
	s.top--;
	cout<<"弹出成功"<<endl;
	return 0;
}//弹出
 
ElemType GetStack(LinkStack s){
	if(s.top==s.bottom){
		cout<<"栈空"<<endl;
		return 0;
	}
	cout<<"栈顶元素为:"<<*(s.top-1)<<endl;
	return *(s.top-1); 
}//取栈顶元素 

int main(){
	LinkStack s;
	InitStack(s);
	ElemType e;
	cout<<"请输入要压入的栈元素"<<endl;
	for(int i=0;i<5;i++){
		cin>>e;
		Push(s,e);
	}
	cout<<"现在的栈顶元素为:"<<endl;
	GetStack(s);
	cout<<"弹出一个栈顶元素"<<endl;
	Pop(s);
	cout<<"现在的栈顶元素为:"<<endl; 
	GetStack(s);
} 

谢谢阅读!

接下来可能会写一些用栈解决的算法问题,感兴趣的小伙伴可以继续关注!!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sunnydog_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值