题目描述
设计一个支持 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>
#include<string>
using namespace std;
class Stack
{
public:
Stack(){};
virtual void Push(const int&x)=0;
virtual bool Pop(int&x)=0;
virtual bool Isempty()const=0;
virtual bool Isfull()const=0;
};
class Seqstack:public Stack
{
private:
int *elements;
int maxsize;
void overflow();
public:
int top;
Seqstack(int sz=500);
~Seqstack(){delete[]elements;}
void Push(const int&x);
bool Pop(int&x);
bool Top(int&x);
bool Isempty()const{return(top==-1)?true:false;}
bool Isfull()const{return(top==maxsize-1)?true:false;}
bool getMin(int&x);
int getsize();
};
int Seqstack::getsize()
{
int a=0,savetop;
savetop=top;
while(top>-1)
{
top--;
a++;
}
top=savetop;
return a;
}
Seqstack::Seqstack(int sz):top(-1),maxsize(sz)
{
elements=new int[maxsize];
}
void Seqstack::Push(const int&x)
{
if(Isfull()==true) overflow();
elements[++top]=x;
}
bool Seqstack::Pop(int&x)
{
if(Isempty()==true)return false;
x=elements[top--];
return true;
}
bool Seqstack::getMin(int&x)
{
int i,min,current,savetop,size;
savetop=top;
Top(min);
size=getsize();
for(i=0;i<size;i++)
{
Top(current);
top--;
if(current<min)
min=current;
}
x=min;
top=savetop;
return true;
}
bool Seqstack::Top(int&x)
{
if(Isempty()==true)return false;
x=elements[top];
return true;
}
void Seqstack::overflow()
{
int *newarray=new int[maxsize+1000];
if(newarray==NULL)exit(1);
for(int i=0;i<=top;i++)
newarray[i]=elements[i];
maxsize=maxsize+1000;
delete[]elements;
elements=newarray;
}
int main()
{
Seqstack num;
int n,i;
int b;
string a;
cin>>n;
for(i=0;i<n;i++)
{
cin>>a;
if(a=="push")
{
cin>>b;
num.Push(b);
}
else if(a=="getMin")
{
num.getMin(b);
cout<<b<<endl;
}
else if(a=="pop")
num.Pop(b);
else if(a=="top")
{
num.Top(b);
cout<<b<<endl;
}
}
return 0;
}