最小栈

最小栈

栈,先进后出,基本功能有pop和push。

现要求设计一个最小栈,可以返回其当前栈中最小的元素

举个例子:

栈A:9,6,3,8

当前最小元素为3

此时1入栈,最小元素变成了1

接着,1出栈,8出栈,3出栈,此时最小元素变成了6


实现方法:

1、准备两个栈sa和sb,再准备一个数组vt用来存数据。(sa为最小栈,sb为辅助栈,vt用来存数据)

2、当第一个元素进入sa,vt也存储该元素,此时该元素为栈sa的最小元素,所以该元素在vt中的下标(0)进入sb

3、此后,sa若是要push一个元素n,先要比较n与vt[sb.top()]的大小,

              若n<vt[sb.top()],则sb入栈n在vt中的下标,否则sb不更新

              sa若是要pop栈顶元素n,先要比较n与vt[sb.top()]的大小,

              若n<vt[sb.top()],则sb出栈n在vt中的下标,否则sb不更新

4、若是要获取最小元素,直接输出vt[sb.top()]即可


代码实现:

#include<iostream>
#include<stack>
#include<vector>
using namespace std; 

stack<int>sa;
stack<int>sb;
vector<int>vt;

int main()
{
	char ch;
	int n;
	cin>>n;
	sa.push(n);//先入栈第一个元素 
	vt.push_back(n);
	sb.push(0);
	while(cin>>ch)
	{
		if(ch=='i')//入栈 
		{
			
			cin>>n;
			vt.push_back(n);
			if(n<vt[sb.top()])
			sb.push(vt.size()-1);
			sa.push(n);
		}
		if(ch=='o')//出栈 
		{
			if(sa.top()==vt[sb.top()])
			{
				sb.pop();
			}
			sa.pop();				
		}
		if(ch=='g')//获取当前最小元素 
		cout<<vt[sb.top()];
	}
 } 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值