这是面试的时候碰到了一个问题,今天整理下思路,实现的代码整理好之后会放在文末。
问题的关键点在于顺序,队列是先进先出的,栈是后进先出的,也就是先进后出。所以他们的放入顺序相同,取出顺序是完全相反的。 另外还需要注意,队列的取出存入操作,不会改变队列中元素的放置顺序,而栈取出再存入,会将栈中元素的排序倒置。
两个队列实现一个栈
因为队列是先进先出的,所以队列的末尾元素就是栈要取出的首元素。
- 首先判断两个队列是否都为空,若为空,将所有元素放入队列1(当然,队列2也可以)。若不为空,将所有元素放入非空队列中。
- 进行出栈操作时,将非空队列的元素放入依次放入空队列中,将最后的尾元素保留并取出。
两个栈实现一个队列
因为栈是先进后出(后进先出)的,所以栈的末尾元素就是栈要取出的首元素。
- 首先判断两个栈是否为空,若为空,将所有元素放入栈1(当然,栈2也可以)。
- 此时,我们需要取出元素时,将栈1的元素全部放入栈2中,因为栈的后进先出的特点,由栈1出栈元素放入栈2后,栈2的出栈操作顺序即为队列元素的取出顺序。所以,可以将使用栈1负责添加元素,栈2负责取出元素。每次栈2为空时,将栈1元素全部放入栈2,继续取出操作即可。
最后
在进行操作的时候,我们需要保证操作的安全性,所以两个队列或者两个栈,要是线程安全的。