实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。
要求:
1、pop、push、getMin操作的时间复杂度都是o(1)。
要求:
1、pop、push、getMin操作的时间复杂度都是o(1)。
2、设计的栈类型可以使用现成的栈结构。
#include<iostream>
#include<stack>
using namespace std;
#define NUM 5
//实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。
//要求:
//1、pop、push、getMin操作的时间复杂度都是o(1)。
//2、设计的栈类型可以使用现成的栈结构。
class MyStack
{
private:
stack<int> stackData;
stack<int> stackMin;
public:
MyStack(){};
~MyStack(){};
void push(int newNum);
int pop();
int getMin();
};
void MyStack::push(int newNum)
{
if(stackMin.empty())
{
stackMin.push(newNum);//如果min栈没有元素,那么新入栈的元素最小
}
else if(newNum <= this->getMin())//如果新入元素比最小元素小,那么将新入元素压入Min栈。
{
stackMin.push(newNum);
}
stackData.push(newNum);//无论新元素进不进Min栈,都是要进data栈的
}
int MyStack::pop()
{
if(stackData.empty())
{
cout<<"栈是空的"<<endl;
return -1;
}
//这里注意,C++版本的pop会把栈顶元素弹出,但不会返回栈顶元素,因此一般和top元素连用
int value = stackData.top();
stackData.pop();
if(value == getMin())
{
stackMin.pop();
}
return value;
}
int MyStack::getMin()
{
if(stackMin.empty())
{
cout<<"栈是空的"<<endl;
return -1;
}
return stackMin.top();
}
int main()
{
MyStack stack1;
stack1.push(1);
cout<<stack1.getMin()<<endl;
stack1.push(3);
cout<<stack1.getMin()<<endl;
stack1.push(4);
cout<<stack1.getMin()<<endl;
stack1.push(2);
cout<<stack1.getMin()<<endl;
stack1.push(0);
cout<<stack1.getMin()<<endl;
stack1.push(-1);
cout<<stack1.getMin()<<endl;
return 0;
}