java实现-剑指offer-面试题7:用两个栈实现队列
2016-07-05 本文已影响0人
栗栗栗
题目:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能。
思路:
栈的特点是后进先出,队列的特点是先进先出。
对于队列的插入功能,栈的压栈操作即可模拟。所以重点在于怎样用栈来模拟队列的删除元素操作,即保证先进入队列的元素先删除。
最直观的办法,就是用stack1来添加元素,需要删除元素的时候,将stack1的元素都弹出,依次压入stack2,这样再从stack2弹出,顺序就如同队列一样是先进先出了。
需要考虑的关键点就在于,当stack2不为空时,删除操作直接从stack2弹出元素即可;当stack2为空时,需要判断stack1里是否有元素,有的话则先把stack1的元素全部压入stack2才可以继续进行弹出操作。
以下面为例:
添加元素:1 2 3 -- stack1元素从栈顶开始为3 2 1,stack2为空
删除元素:1 2 --将stack1元素全部弹出压入stack2,stack1为空,stack2从栈顶开始元素为1 2 3,弹出1 2,剩下元素3
添加元素:4 5 --stack1依次压入4 5,且只含这两个元素,stack2还是3
删除元素:3 4 --先查看stack2不为空,弹出元素3,然后判断stack1不为空,将元素弹出压入stack2,再弹出4即可,此时stack1为空,stack2剩下元素5
最后的代码如下