经典问题
1括号匹配问题
class Solution { public boolean isValid(String s) { if(s.length()<=1) return false; Map<Character,Character> smap=new HashMap<>(); smap.put('(',')'); smap.put('{','}'); smap.put('[',']'); Stack<Character> stack=new Stack<>(); for(int i=0;i<s.length();i++){ char item=s.charAt(i); if(smap.containsKey(item)){ stack.push(item); } else { if(!stack.isEmpty()){ Character left=stack.pop(); char rightchar=smap.get(left); //char 类型 if(item!=rightchar){ return false; } } else { return false; } } } return stack.isEmpty(); } }
2最小栈
JDK官方已建议优先使用Deque的实现类来代替Stack。%%%
LinkedList%%%
使得每个元素 a 与其相应的最小值 m 时刻保持一一对应。因此我们可以使用一个辅助栈,与元素栈同步插入与删除,用于存储与每个元素对应的最小值。
class MinStack { Deque<Integer> xStack; Deque<Integer> minStack; public MinStack() { xStack=new LinkedList<Integer>(); minStack=new LinkedList<Integer>(); minStack.push(Integer.MAX_VALUE); } public void push(int val) { xStack.push(val); minStack.push(Math.min(val,minStack.peek())); } public void pop() { xStack.pop(); minStack.pop(); } public int top() { return xStack.peek(); } public int getMin() { return minStack.peek(); } }
3最大栈
用Stack和Deque都可以吗?%%%
与最小栈思路类似,用辅助栈存最大值。
对于popMax(),xStack出栈存入辅助辅助栈,直到找到最大值。之后再把xStack复原。
妙用三元运算符,处理第一个push,最大值
注意题目给的返回值类型
class MaxStack { Stack<Integer> stack; //? Stack<Integer> maxStack; public MaxStack() { stack = new Stack(); maxStack = new Stack(); } public void push(int x) { int max = maxStack.isEmpty() ? x : maxStack.peek(); //妙,灵活处理第一个push maxStack.push(max > x ? max : x); //妙,用不着max()了 stack.push(x); } public int pop() { maxStack.pop(); return stack.pop(); //注意题目返回值是int } public int top() { return stack.peek(); } public int peekMax() { return maxStack.peek(); } public int popMax() { int max = peekMax(); Stack<Integer> buffer = new Stack(); while (top() != max) buffer.push(pop()); //复用top() pop(); while (!buffer.isEmpty()) push(buffer.pop()); return max; } }