《剑指Offer》面试题七之用两个栈实现队列
2017-03-06 17:15
85 查看
题目描述
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数:appendTail()和
deleteHead(),分别完成在队列的尾部添加结点以及在队列的头部删除结点。
class MyQueue<T>{ private Stack<T> stack1; private Stack<T> stack2; public MyQueue(){ stack1=new Stack<T>(); stack2=new Stack<T>(); }
解题思路
解题思路如下图所示:上面的图就是大致的思路:
队列尾部添加元素
在
stack1中插入元素,如上图中的
x5。
如果想删除头结点呢?
则将
stack1中的元素全部“倒入”
stack2,这时候
stack2中的元素就是
stack1中的反序了。
那么
stack2出栈的就是最先进入栈的元素了。
以上讲的只是一个大致的思路,还有一些小细节要去润色。比如如果这时候
stack2中的元素没有全部出栈,这时候又有数据要进栈呢?
第一种思路
我们将
stack2中的元素再次“倒回”,这时候问题就回到初始状况。
思考?我们真的需要做这一次的“倒回”操作吗?答案是否定的,我们看一下下面优化的解法!
第二种思路
在插入元素的时候我们仍然在stack1中插入元素。
删除元素头元素的时候我们仍然继续在
stack2中删除。
如果
stack2为空,我们再将
stack1中的元素“倒入”
stack2。
不知道不有没有理解我的意思?
代码实现
这里的代码是第二种思路的:class MyQueue<T>{ private Stack<T> stack1; private Stack<T> stack 4000 2; public MyQueue(){ stack1=new Stack<T>(); stack2=new Stack<T>(); } public void appentTail(T ele){ //尾部插入 stack1.push(ele); } public T deleteHead() throws Exception{ //头部删除 if(stack2.isEmpty()){ //如果stack2为空 while(!stack1.isEmpty()){ //stack1的元素全部倒入stack2 stack2.push(stack1.pop()); } } if(stack2.isEmpty()) throw new Exception("队列为空"); return stack2.pop(); } }
题目扩展
如果是两个队列实现一个栈呢?又该怎样去实现?相关文章推荐
- 《剑指Offer》面试题:用两个栈来实现一个队列
- 剑指offer面试题7——用两个栈实现队列
- 剑指offer 面试题7 两个栈实现队列 java版答案
- 剑指offer面试题7:用两个栈实现队列
- 《剑指Offer》面试题:用两个队列实现一个栈
- 剑指offer面试题7(java实现):用两个栈实现队列
- 《剑指Offer》面试题-用两个栈实现队列
- 剑指Offer---面试题:使用两个栈实现队列
- 《剑指offer》面试题七 用两个栈实现队列
- 《剑指Offer》学习笔记--面试题7:用两个栈实现队列
- 《剑指Offer》面试题7:用两个栈实现队列
- 剑指offer-面试题7:用两个栈实现队列
- 剑指offer-面试题7-用两个栈实现队列
- (剑指Offer)面试题7:用两个栈实现队列
- 剑指offer面试题之用两个栈实现队列
- 面试题07_用两个栈实现队列——剑指offer系列
- 剑指offer面试题7——用两个栈实现队列
- 《剑指Offer》面试题-用两个栈实现队列
- 剑指Offer系列-面试题7:用两个栈实现队列
- 剑指Offer(第二版)面试题9:用两个栈实现队列