劍指offer 計劃1(棧與佇列)---java
阿新 • • 發佈:2021-09-01
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(); */