一. 这题解法有很多,充分考虑了栈的性质.分为用辅助栈以及不用辅助栈.(以空间换时间)
二. 用辅助栈.(截图来自左程云大佬的书)
1. 第一种应用辅助栈的思路,mindata顶部只存最小的值.(push时稍省空间,pop时稍费时间)
//使用辅助栈
class MinStack {
public:
/** initialize your data structure here. */
//一个存放数据的栈.
stack<int> data;
//一个存放当前栈里最小值的栈.
stack<int> mindata;
MinStack() {
}
void push(int x) {
//当mindata为空或者x小于mindata顶部的值,
//push x.
if(mindata.empty() || x<=mindata.top())
mindata.push(x);
data.push(x);
}
void pop() {
//如果mindata的顶部和data顶部相同,则mindata需pop.
if(mindata.top()==data.top())
mindata.pop();
data.pop();
}
int top() {
return data.top();
}
int getMin() {
return mindata.top();
}
};
2. 第二种辅助栈,mindata与data存入同样多数据.(push稍费空间,pop稍省时间)
class MinStack {
public:
/** initialize your data structure here. */
//一个存放数据的栈.
stack<int> data;
//一个存放当前栈里最小值的栈.
stack<int> mindata;
MinStack() {
}
void push(int x) {
//当mindata为空或者x小于mindata顶部的值,
//push x.大于时push当前最小值.
if (mindata.empty() || x <= mindata.top())
mindata.push(x);
else {
int minv = mindata.top();
mindata.push(minv);
}
data.push(x);
}
void pop() {
//弹出时比较方便
mindata.pop();
data.pop();
}
int top() {
return data.top();
}
int getMin() {
return mindata.top();
}
};
三. 不用辅助栈,比较费时间,但是省空间.
//只用一个栈,但每次push两个
class MinStack {
public:
/** initialize your data structure here. */
stack<int> s;
MinStack() {
}
void push(int x) {
if (s.empty())
{
s.push(x);
s.push(x);
}
else
{
int top = s.top();
s.push(x);
if (x<top)
s.push(x);
else
s.push(top);
}
}
void pop() {
s.pop();
s.pop();
}
int top() {
int top = s.top();
s.pop();
int data = s.top();
s.push(top);
return data;
}
int getMin() {
return s.top();
}
};