题目描述
设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。
- push(x) -- 将元素x推入栈中。
- pop() -- 删除栈顶的元素。
- top() -- 获取栈顶元素。
- getMin() -- 检索栈中的最小元素。
输入
第一行一个整数q,表示操作数量。
接下来q行,每行为题目四中操作的一种。
分别为
push x
pop
top
getMin
数据范围:q<=100000, |x|<=1000000000。
题目保证在执行pop,top,getMin操作时栈不为空。
输出
输出top和getMin操作时的答案
每个数占一行
样例输入
7
push -2
push 0
push -3
getMin
pop
getMin
top
样例输出
-3
-2
0
#include<iostream>
using namespace std;
#include<string>
class Stack{
private:
int *p;
int top;
int maxsize;
public:
Stack(int size)
{
top=-1;
maxsize=size;
p=new int[size];
}
bool IsEmpty(){return (top==-1)?true:false;}
bool IsFull(){return (top==maxsize-1)?true:false;}
bool Push(int &x)
{
if(IsFull())
return false;
p[++top]=x;
return true;
}
bool Pop(int &x)
{
if(IsEmpty())
return false;
x=p[top--];
}
bool Top(int &x)
{
if(IsEmpty())
return false;
x=p[top];
return true;
}
bool Min(int &x)
{
if(IsEmpty())
return false;
x=p[0];
for(int i=1;i<=top;i++)
if(p[i]<x)
x=p[i];
return true;
}
};
int main()
{
int q,x;
string s,s1="push",s2="pop",s3="top",s4="getMin";
Stack *p=new Stack(300);
cin>>q;
for(int i=0;i<q;i++)
{
cin>>s;
if(s==s1)
{
cin>>x;
p->Push(x);
}
if(s==s2)
{
p->Pop(x);
}
if(s==s3)
{
p->Top(x);
cout<<x<<endl;
}
if(s==s4)
{
p->Min(x);
cout<<x<<endl;
}
}
delete p;
return 0;
}