版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013325815/article/details/86415161
Design a max stack that supports push, pop, top, peekMax and popMax.
- push(x) -- Push element x onto stack.
- pop() -- Remove the element on top of the stack and return it.
- top() -- Get the element on the top.
- peekMax() -- Retrieve the maximum element in the stack.
- popMax() -- Retrieve the maximum element in the stack, and remove it. If you find more than one maximum elements, only remove the top-most one.
Example 1:
MaxStack stack = new MaxStack(); stack.push(5); stack.push(1); stack.push(5); stack.top(); -> 5 stack.popMax(); -> 5 stack.top(); -> 1 stack.peekMax(); -> 5 stack.pop(); -> 1 stack.top(); -> 5
Note:
- -1e7 <= x <= 1e7
- Number of operations won't exceed 10000.
- The last four operations won't be called when stack is empty.
思路:难点在于popmax,需要把当前max stack的peek 从stack里面remove掉,同时更新当前的max,用个temp stack解决,存储当前的Integer到max的值,然后再存储回来;
class MaxStack {
Stack<Integer> stack;
Stack<Integer> maxStack;
/** initialize your data structure here. */
public MaxStack() {
stack = new Stack<Integer>();
maxStack = new Stack<Integer>();
}
public void push(int x) {
stack.push(x);
if(!maxStack.isEmpty()){
if(x >= maxStack.peek()){
maxStack.push(x);
}
} else {
maxStack.push(x);
}
}
public int pop() {
int value = stack.pop();
if(!maxStack.isEmpty() && value == maxStack.peek()){
maxStack.pop();
}
return value;
}
public int top() {
return stack.peek();
}
public int peekMax() {
return maxStack.peek();
}
public int popMax() {
int value = maxStack.pop();
Stack<Integer> temp = new Stack<Integer>();
while(stack.peek()!=value){
temp.push(stack.pop());
}
stack.pop();
while(!temp.isEmpty()){
this.push(temp.pop());
}
return value;
}
}
/**
* Your MaxStack object will be instantiated and called as such:
* MaxStack obj = new MaxStack();
* obj.push(x);
* int param_2 = obj.pop();
* int param_3 = obj.top();
* int param_4 = obj.peekMax();
* int param_5 = obj.popMax();
*/