public boolean isValid(String s) { if(s.equalsIgnoreCase("")) return true; Map<Character,Character> ps=new HashMap<Character,Character>(); ps.put('{', '}');ps.put('[', ']');ps.put('(', ')'); Stack<Character> stack=new Stack<Character>(); for(char c:s.toCharArray()){ if(ps.containsKey(c)){ stack.push(c); }else{ if(stack.isEmpty()){ return false; }else{ Character top=stack.peek(); if(ps.get(top).equals(c)){ stack.pop(); }else{ return false; } } } } if(!stack.isEmpty()) return false; else return true; }
public class MinStack { private Stack<Integer> stack; private Map<Integer,Integer> minMap; public MinStack() { this.stack=new Stack<Integer>(); this.minMap=new HashMap<Integer,Integer>(); } public void push(int x) { if(stack.isEmpty()){ stack.push(x); minMap.put(stack.size(), x); }else{ int preMin=minMap.get(stack.size()); stack.push(x); minMap.put(stack.size(), Math.min(preMin, x)); } } public void pop() { stack.pop(); } public int top() { return stack.peek(); } public int getMin() { return minMap.get(stack.size()); } }
public class MinStack { private Stack<Integer> stack; private Stack<Integer> minStack;; public MinStack() { this.stack=new Stack<Integer>(); this.minStack=new Stack<Integer>(); } public void push(int x) { if(stack.isEmpty()){ stack.push(x); minStack.push(x); }else{ stack.push(x); int preMin=minStack.peek(); minStack.push(Math.min(preMin, x)); } } public void pop() { stack.pop(); minStack.pop(); } public int top() { return stack.peek(); } public int getMin() { return minStack.peek(); } }
public class MyStack { private Queue<Integer> queueOne; private Queue<Integer> queueTemp; public MyStack(){ queueOne=new LinkedList<Integer>(); queueTemp=new LinkedList<Integer>(); } public void push(int x) { queueOne.add(x); } public void pop() { while(true){ Integer front=queueOne.poll(); if(queueOne.isEmpty()){ Queue<Integer> t=queueOne; queueOne=queueTemp; queueTemp=t; break; }else{ queueTemp.add(front); } } } public int top() { Integer front=null; while(true){ front=queueOne.poll(); if(queueOne.isEmpty()){ Queue<Integer> t=queueOne; queueOne=queueTemp; queueTemp=t; break; }else{ queueTemp.add(front); } } queueOne.add(front); return front; } public boolean empty() { return queueOne.isEmpty(); } }方案二
public class MyStack { private Queue<Integer> queue; public MyStack(){ queue=new LinkedList<Integer>(); } public void push(int x) { int size=queue.size(); queue.add(x); for(int i=0;i<size;i++){ Integer t=queue.peek(); queue.poll(); queue.add(t); } } public void pop() { queue.poll(); } public int top() { return queue.peek(); } public boolean empty() { return queue.isEmpty(); } }
class MyQueue { private Stack<Integer> stackIn; private Stack<Integer> stackOut; private void inToOut(){ while(!stackIn.isEmpty()){ Integer top=stackIn.peek(); stackIn.pop(); stackOut.push(top); } } public MyQueue(){ stackIn=new Stack<Integer>(); stackOut=new Stack<Integer>(); } public void push(int x) { stackIn.push(x); } public void pop() { if(stackOut.isEmpty()){ inToOut(); } stackOut.pop(); } public int peek() { if(stackOut.isEmpty()){ inToOut(); } Integer top=stackOut.peek(); return top; } public boolean empty() { return stackIn.isEmpty()&&stackOut.isEmpty(); } }
分析
深度优先遍历,利用栈记录遍历路径。
public List<Integer> inorderTraversal(TreeNode root) { List<Integer> res=new LinkedList<Integer>(); Stack<TreeNode> stack=new Stack<TreeNode>(); TreeNode p=root;//当前处理的树根 while(p!=null||!stack.isEmpty()){ while(p!=null){//先处理左子树 stack.push(p); p=p.left; } p=stack.pop(); res.add(p.val); //处理右子树 p=p.right; } return res; }
public List<Integer> preorderTraversal(TreeNode root) { List<Integer> res=new LinkedList<Integer>(); Stack<TreeNode> stack=new Stack<TreeNode>(); TreeNode p=root;//当前处理的树根 while(p!=null||!stack.isEmpty()){ while(p!=null){//先处理左子树 stack.push(p); res.add(p.val); p=p.left; } p=stack.pop(); //处理右子树 p=p.right; } return res; }
public List<List<Integer>> zigzagLevelOrder(TreeNode root) { List<List<Integer>> levels=new LinkedList<List<Integer>>(); if(root==null) return levels; Queue<TreeNode> queue=new LinkedList<TreeNode>(); queue.add(root); int mark=0; while(!queue.isEmpty()){ List<Integer> list=new ArrayList<Integer>(); Queue<TreeNode> nextqueue=new LinkedList<TreeNode>(); while(!queue.isEmpty()){ TreeNode node=queue.poll(); list.add(node.val); if(node.left!=null)nextqueue.add(node.left); if(node.right!=null)nextqueue.add(node.right); } queue=nextqueue; if(mark==1) Collections.reverse(list); mark=(mark+1)%2; levels.add(list); } return levels; }
public int evalRPN(String[] tokens) { Stack<Integer> stack=new Stack<Integer>(); for(String token:tokens){ if(token.equalsIgnoreCase("+")){ Integer second=stack.pop(); Integer first=stack.pop(); stack.push(first+second); }else if(token.equalsIgnoreCase("-")){ Integer second=stack.pop(); Integer first=stack.pop(); stack.push(first-second); }else if(token.equalsIgnoreCase("*")){ Integer second=stack.pop(); Integer first=stack.pop(); stack.push(first*second); }else if(token.equalsIgnoreCase("/")){ Integer second=stack.pop(); Integer first=stack.pop(); stack.push(first/second); }else{ stack.push(Integer.parseInt(token)); } } return stack.pop(); }
public class BSTIterator { private Stack<TreeNode> stack; private TreeNode p; public BSTIterator(TreeNode root) { p=root; stack=new Stack<TreeNode>(); } public boolean hasNext() { return !(p==null&&stack.isEmpty()); } public int next() { while(p!=null){ stack.push(p); p=p.left; } TreeNode top=stack.pop(); p=top.right; return top.val; } }
public List<Integer> postorderTraversal(TreeNode root) { List<Integer> res=new LinkedList<Integer>(); Stack<TreeNode> stack=new Stack<TreeNode>(); Map<TreeNode,Integer> mark=new HashMap<TreeNode,Integer>(); TreeNode p=root; while(p!=null||!stack.isEmpty()){ while(p!=null){ stack.push(p); p=p.left; } p=stack.peek(); if(p.right==null){ res.add(p.val); stack.pop(); p=null; }else{//有右子树 if(mark.get(p)==null){ mark.put(p, 1); p=p.right; }else{ res.add(p.val); stack.pop(); mark.remove(p); p=null; } } } return res; }
public int calculate(String s) { if(s == null) return 0; s = reform(s); int result = 0, num = 0, base = 1; for(char c: s.toCharArray()) switch(c){ case '+': result += num; num = 0; base = 1; break; case '-': result -= num; num = 0; base = 1; break; default: num += (c - '0') * base; base *= 10; } return result; } private String reform(String s) { StringBuilder sb = new StringBuilder(); Stack<Boolean> stack = new Stack<>(); stack.push(true); boolean add = true; for(char c: s.toCharArray()) switch(c){ case ' ': break; case '(': stack.push(add); break; case ')': stack.pop(); break; case '+': add = stack.peek(); sb.append(stack.peek() ? '+' : '-'); break; case '-': add = !stack.peek(); sb.append(stack.peek() ? '-' : '+'); break; default: sb.append(c); } if(sb.charAt(0) != '+' || sb.charAt(0) != '-') sb.insert(0, '+'); return sb.reverse().toString(); }
public boolean isValidSerialization(String preorder) { Stack<String> stack=new Stack<String>(); if(preorder.equals("")) return false; String[] values = preorder.split(","); System.out.println(values.length); if(values[0].equals("#")&&values.length==1) return true; if(values[0].equals("#")) return false; stack.push(values[0]); int mark=0; for(int i=1;i<values.length;i++){ if(stack.isEmpty()) return false; String p=stack.peek(); if(mark==0){//左子树 if(values[i].equals("#")){ mark=(mark+1)%2;//左子树为空,转成处理右子树 }else{ stack.push(values[i]);//继续处理左子树的左子树 } }else{//右子树 if(values[i].equals("#")){ stack.pop();//继续处理根元素的右子树 }else{ stack.push(values[i]); } } } if(!stack.isEmpty()) return false; else return true; }