栈和队列的算法题总结
生活随笔
收集整理的這篇文章主要介紹了
栈和队列的算法题总结
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1.設計一個有getMin功能的棧
實現(xiàn)一個特殊的棧,在實現(xiàn)棧的基本功能的基礎上,再實現(xiàn)返回棧中最小元素的操作
要求:peek、pop、push、getMin操作的時間復雜度都是O(1),且設計的棧類型可以使用現(xiàn)成的棧結(jié)構(gòu)
思路:建立兩個棧,一個data棧作為原始棧,一個help棧為小頂棧,跟data同步壓棧,如果新進棧的數(shù)比當前help棧頂元素大,則繼續(xù)壓入棧頂?shù)脑?#xff0c;否則壓入棧頂,遍歷一遍即可解決
例如:
| ?4 ?| ? ? | ?3 ?|
| ?6 ?| ? ? | ?3 ?|
| ?3 ?| ? ? | ?3 ?|
| ?5 ?| ? ? | ?4 ?|
| ?4 ?| ? ? | ?4 ?|
|_5_| ? ? |_5_|
data ? ? ? help
編寫一個類,用兩個棧實現(xiàn)隊列,支持隊列的基本操作(add、poll、peek)
思路:一個棧正常入棧,之后倒入另一個輔助棧,輔助棧倒出即可實現(xiàn)。特別注意兩點需要控制,倒入help輔助棧前,help必須為空,倒入help棧時,必須將data棧排空
public static class TwoStackQueue{public Stack<Integer> stackPush;public Stack<Integer> stackPop;public TwoStackQueue(){stackPush = new Stack<Integer>();stackPop = new Stack<Integer>();}public void add(int pushInt){stackPush.push(pushInt);}public int poll(){if(stackPop.empty() && stackPush.empty()){throw new RuntimeException("Queue is empty!");}else if(stackPop.empty()){while(!stackPush.empty()){stackPop.push(stackPush.pop());}}return stackPop.pop();}public int peek(){if(stackPop.empty() && stackPush.empty()){throw new RuntimeException("Queue is empty!");}else if(stackPop.empty()){while(!stackPush.empty()){stackPop.push(stackPush.pop());}}return stackPop.peek();} }
3.3.由兩個隊列組成的棧
編寫一個類,用兩個隊列實現(xiàn)棧,支持棧的基本操作(push、poll、peek) public static class Queue<T>{private LinkedList<T> queue = new LinkedList<T>();//LinkedList標準的雙端隊列,ArrayList是動態(tài)數(shù)組,在刷題階段時使用鏈表時用LinkedListpublic boolean isEmpty(){return queue.isEmpty();}public int size(){return queue.size();}public void add(T value){queue.addFirst(value);}public T pull(){return queue.pullLast();}public T peek(){return queue.peek();} } public static class Stack<T>{private Queue<T> dQueue = new Queue<T>();private Queue<T> hQueue = new Queue<T>();public boolean isEmpty(){return dQueue.isEmpty();}public int size(){return dQueue.size();}public void push(T value){dQueue.add(value);}public T pop(){if(dQueue.isEmpty()){throw new RuntimeException("Queue is empty!");}while(dQueue.size()!=1){hQueue.add(dQueue.pull());}T res = dQueue.pull();while(!hQueue.isEmpty()){dQueue.add(hQueue.pull());}return res;}public T peek(){if(dQueue.isEmpty()){throw new RuntimeException("Queue is empty!");}while(dQueue.size()!=1){hQueue.add(dQueue.pull());}T res = dQueue.pull();hQueue.add(res);while(!hQueue.isEmpty()){dQueue.add(hQueue.pull());}return res;}}
實現(xiàn)一個特殊的棧,在實現(xiàn)棧的基本功能的基礎上,再實現(xiàn)返回棧中最小元素的操作
要求:peek、pop、push、getMin操作的時間復雜度都是O(1),且設計的棧類型可以使用現(xiàn)成的棧結(jié)構(gòu)
思路:建立兩個棧,一個data棧作為原始棧,一個help棧為小頂棧,跟data同步壓棧,如果新進棧的數(shù)比當前help棧頂元素大,則繼續(xù)壓入棧頂?shù)脑?#xff0c;否則壓入棧頂,遍歷一遍即可解決
例如:
| ?4 ?| ? ? | ?3 ?|
| ?6 ?| ? ? | ?3 ?|
| ?3 ?| ? ? | ?3 ?|
| ?5 ?| ? ? | ?4 ?|
| ?4 ?| ? ? | ?4 ?|
|_5_| ? ? |_5_|
data ? ? ? help
?即,此時help棧頂即為data棧中的最小值,同步壓棧
public static class MyStack1{private Stack<Integer> stackData;private Stack<Integer> stackMin;public MyStack1(){this.stackData = new Stack<Integer>();this.stackMin = new Stack<Integer>();}public void push(){if(this.stackMin.isEmpty()){this.stackMin.push(newNum);}else if(newNum <= this.getmin()){this.stackMin.push(newNum);}this.stackData.push(newNum);}public int pop(){if(this.stackData.isEmpty()){throw new RuntimeException("Your stack is empty!");}int value = this.stackData.pop();if(value == this.getmin()){this.stackMin.pop();}return value;}public int geimin(){if(this.stackMin.isEmpty()){throw new RuntimeException("Your stack is empty!");}return this.stackMin.peek();}}public static class MyStack2{private Stack<Integer> stackData;private Stack<Integer> stackMin;public MyStack1(){this.stackData = new Stack<Integer>();this.stackMin = new Stack<Integer>();}public void push(){if(this.stackMin.isEmpty()){this.stackMin.push(newNum);}else if(newNum < this.getmin()){this.stackMin.push(newNum);}else{int newMin = this.stackMin.peek();this.stackMin.push(newMin);}this.stackData.push(newNum);}public int pop(){if(this.stackData.isEmpty()){throw new RuntimeException("Your stack is empty!");}this.stackMin.pop();return this.stackData.pop();}public int geimin(){if(this.stackMin.isEmpty()){throw new RuntimeException("Your stack is empty!");}return this.stackMin.peek();}}
編寫一個類,用兩個棧實現(xiàn)隊列,支持隊列的基本操作(add、poll、peek)
思路:一個棧正常入棧,之后倒入另一個輔助棧,輔助棧倒出即可實現(xiàn)。特別注意兩點需要控制,倒入help輔助棧前,help必須為空,倒入help棧時,必須將data棧排空
public static class TwoStackQueue{public Stack<Integer> stackPush;public Stack<Integer> stackPop;public TwoStackQueue(){stackPush = new Stack<Integer>();stackPop = new Stack<Integer>();}public void add(int pushInt){stackPush.push(pushInt);}public int poll(){if(stackPop.empty() && stackPush.empty()){throw new RuntimeException("Queue is empty!");}else if(stackPop.empty()){while(!stackPush.empty()){stackPop.push(stackPush.pop());}}return stackPop.pop();}public int peek(){if(stackPop.empty() && stackPush.empty()){throw new RuntimeException("Queue is empty!");}else if(stackPop.empty()){while(!stackPush.empty()){stackPop.push(stackPush.pop());}}return stackPop.peek();} }
3.3.由兩個隊列組成的棧
編寫一個類,用兩個隊列實現(xiàn)棧,支持棧的基本操作(push、poll、peek) public static class Queue<T>{private LinkedList<T> queue = new LinkedList<T>();//LinkedList標準的雙端隊列,ArrayList是動態(tài)數(shù)組,在刷題階段時使用鏈表時用LinkedListpublic boolean isEmpty(){return queue.isEmpty();}public int size(){return queue.size();}public void add(T value){queue.addFirst(value);}public T pull(){return queue.pullLast();}public T peek(){return queue.peek();} } public static class Stack<T>{private Queue<T> dQueue = new Queue<T>();private Queue<T> hQueue = new Queue<T>();public boolean isEmpty(){return dQueue.isEmpty();}public int size(){return dQueue.size();}public void push(T value){dQueue.add(value);}public T pop(){if(dQueue.isEmpty()){throw new RuntimeException("Queue is empty!");}while(dQueue.size()!=1){hQueue.add(dQueue.pull());}T res = dQueue.pull();while(!hQueue.isEmpty()){dQueue.add(hQueue.pull());}return res;}public T peek(){if(dQueue.isEmpty()){throw new RuntimeException("Queue is empty!");}while(dQueue.size()!=1){hQueue.add(dQueue.pull());}T res = dQueue.pull();hQueue.add(res);while(!hQueue.isEmpty()){dQueue.add(hQueue.pull());}return res;}}
總結(jié)
以上是生活随笔為你收集整理的栈和队列的算法题总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 有关完全二叉树求节点数和前缀树求字符串是
- 下一篇: 有关递归的三道算法题总结