/*
40
1)设计一个栈结构,满足一下条件:min,push,pop 操作的时间复杂度为 O(1)。
使用一个辅助栈来保存最小元素,该辅助栈名字为minimum stack,
其栈顶元素为当前栈中的最小元素。
要获取当前栈中最小元素,只需要返回minimum stack的栈顶元素即可。
每次执行push操作,检查push的元素是否小于或等于minimum stack栈顶元素。
如果是,则也push该元素到minimum stack中。
当执行pop操作的时候,检查pop的元素是否与当前最小值相等。
如果相同,则需要将改元素从minimum stack中pop出去。
*/
#include<iostream>
#include<stdio.h>
#include<stack>
using namespace std;
struct StackGetMin{
stack<int> element;
stack<int> minStack;
void push(int x)
{
element.push(x);
//push的元素小于当前minStack的最小元素,则push到minStack中
if(minStack.empty() || x<=minStack.top( ))
minStack.push(x);
}
bool pop(){
if(element.empty()) return false;
//如果原始栈栈顶元素与minStack栈顶元素相同,则将该元素也从minStack中pop出去。
if(element.top()==minStack.top())
minStack.pop();
element.pop();
return true;
}
bool getMin(int &min)
{
if(minStack.empty())
return false;
else
{
min=minStack.top();//不需要出栈
return true;
}
}
};
int main(){
StackGetMin stackMin;
stackMin.push(4);
stackMin.push(6);
stackMin.push(2);
stackMin.push(1);
stackMin.push(5);
int min =0;
//4 6 2 1 5
stackMin.getMin(min);cout<<min<<endl;//1
stackMin.pop();//4 6 2 1
stackMin.pop();//4 6 2
stackMin.getMin(min);cout<<min<<endl;//2
stackMin.pop();//4 6
stackMin.getMin(min);cout<<min<<endl;//4
stackMin.push(3);
stackMin.push(7);//4 6 3 7
stackMin.getMin(min);cout<<min<<endl;//3
return 0;
}