1.1、题目1 剑指 Offer 09. 用两个栈实现队列 1.2、解法
解法如题目所说。定义两个栈。这里假设第一个栈为a,第二个栈为b。
实现两个函数增加尾和删除头。
增加即直接push入第一个栈。
删除函数:通过判断a是否为空进行循环,将已经存入的a的栈顶pop存到b中,以此达到倒置的效果。
再将b的栈顶pop出来即可达到删除。
此时a栈为空,下次判断若b栈为空,则输出-1。
否则则继续通过b栈输出栈顶。
1.3、代码 class CQueue { Deque<Integer> a; Deque<Integer> b; public CQueue() { a = new LinkedList<Integer>(); b = new LinkedList<Integer>(); } public void appendTail(int value) { a.push(value); } public int deleteHead() { if(b.isEmpty()){ while(!a.isEmpty()){ b.push(a.pop()); } } if(b.isEmpty()){ return -1; }else{ return (int)b.pop(); } } } /** * Your CQueue object will be instantiated and called as such: * CQueue obj = new CQueue(); * obj.appendTail(value); * int param_2 = obj.deleteHead(); */ 2.1、题目2 剑指 Offer 30. 包含min函数的栈 2.2、解法仍是通过两个栈的方式,第一个栈为d1,第二个栈为d2
d1的push、pop、top不受影响。
至于d2,push时需将d2栈顶元素与目前元素判断,若大于或者等于,则存进d2
pop时,若d2栈顶元素与d1 pop的元素相同,则共同pop
此时d2的栈顶为最小值。
2.3、代码 class MinStack { Deque<Integer> d1,d2; /** initialize your data structure here. */ public MinStack() { d1 = new LinkedList<Integer>(); d2 = new LinkedList<Integer>(); } public void push(int x) { d1.push(x); if(d2.isEmpty()||d2.peek()>=x){ d2.push(x); } } public void pop() { if(d1.pop().equals(d2.peek())){ d2.pop(); } } public int top() { return (int)d1.peek(); } public int min() { return (int)d2.peek(); } } /** * Your MinStack object will be instantiated and called as such: * MinStack obj = new MinStack(); * obj.push(x); * obj.pop(); * int param_3 = obj.top(); * int param_4 = obj.min(); */