用两个栈实现一个队列。队列的声明如下,请实现它的两个函数:appendTail()
和deleteHead()
,分别完成在队列的尾部添加结点以及在队列的头部删除结点。
解题思路如下图所示:
上面的图就是大致的思路:
队列尾部添加元素 在stack1
中插入元素,如上图中的x5
。 如果想删除头结点呢? 则将stack1
中的元素全部“倒入”stack2
,这时候stack2
中的元素就是stack1
中的反序了。 那么stack2
出栈的就是最先进入栈的元素了。 以上讲的只是一个大致的思路,还有一些小细节要去润色。比如如果这时候stack2
中的元素没有全部出栈,这时候又有数据要进栈呢?
我们将
stack2
中的元素再次“倒回”,这时候问题就回到初始状况。
思考?我们真的需要做这一次的“倒回”操作吗?答案是否定的,我们看一下下面优化的解法!
在插入元素的时候我们仍然在stack1
中插入元素。 删除元素头元素的时候我们仍然继续在stack2
中删除。 如果stack2
为空,我们再将stack1
中的元素“倒入”stack2
。
不知道不有没有理解我的意思?
这里的代码是第二种思路的:
class MyQueue<T>{ private Stack<T> stack1; private Stack<T> stack2; 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(); }}如果是两个队列实现一个栈呢?又该怎样去实现?
新闻热点
疑难解答