您的位置:首页 > 职场人生

《剑指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();
}
}


题目扩展

如果是两个队列实现一个栈呢?又该怎样去实现?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: