Catalogue:stack
Question
Design a stack that supports push, pop, top, and retrieving the minimum element in constant time.
- push(x) -- Push element x onto stack.
- pop() -- Removes the element on top of the stack.
- top() -- Get the top element.
- getMin() -- Retrieve the minimum element in the stack.
First try:
class MinStack {
public:
void push(int x) {
stack.push_back(x);
if(minPos.size()==0)
{
minPos.push_back(0);
}
else if(stack[minPos.top()] > x)
{
minPos.push_back(stack.size()-1);
}
else
{
minPos.push_back(minPos.top());
}
}
void pop() {
stack.erase(stack.end());
minPos.erase(minPos.end());
}
int top() {
return stack.end();
}
int getMin() {
return stack[minPos.top()]
}
private:
vector<int> stack;
int pStack;
vector<int> minPos;
};
Result: ‘class std::vector<int>’ has no member named ‘top’
Second try
class MinStack {
public:
void push(int x) {
stack.push_back(x);
if(minPos.size()==0)
{
minPos.push_back(0);
}
else if(stack[minPos[minPos.size()-1]] > x)
{
minPos.push_back(stack.size()-1);
}
else
{
minPos.push_back(minPos[minPos.size()-1]);
}
}
void pop() {
stack.erase(stack.end());
minPos.erase(minPos.end());
}
int top() {
return stack[stack.size()-1];
}
int getMin() {
return stack[minPos[minPos.size()-1]];
}
private:
vector<int> stack;
vector<int> minPos;
};
Result: Runtime Error
Last executed input: push(-2),push(0),push(-1),getMin,top,pop,getMin
Third try
min position并不需要每个都入栈
class MinStack {
public:
void push(int x) {
minStack.push(x);
if(minPos.empty())
{
minPos.push(x);
}
else if(minPos.top() >= x)
{
minPos.push(x);
}
}
void pop() {
if(minStack.top() == minPos.top())
{
minPos.pop();
}
minStack.pop();
}
int top() {
return minStack.top();
}
int getMin() {
return minPos.top();
}
private:
stack<int> minStack;
stack<int> minPos;
};
Result: Accepted