最小栈
栈,先进后出,基本功能有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()];
}
}