面试题7-用两个栈实现队列
基础知识
栈是一种非常常见的数据结构,特点是后入先出,即最后被压入栈的元素会被第一个弹出。栈在计算机领域的应用广泛,举了例子:在操作系统中,操作系统会给每个线程创建一个栈来存储函数调用时各个函数的参数、返回地址临时变量等。通常栈是一个不考虑排序的数据结构,需要O(n)的时间才能找到栈中最大或者最小的元素。
队列是另外一种很重要的数据结构。队列的特点是先进先出,即第一个进入队列的元素将会第一个出来。队列的应用场景也很广泛:在树的层次遍历中可以利用队列这种数据结构,把每一层的子结点都放入到队列中,就可以按照顺序去一层一层的遍历。 栈和队列虽然是两种截然不同的数据结构,但是他们却相互联系,可以使用栈来实现队列,也可以用队列来实现栈。题目
使用两个栈来实现一个队列,完成队列的Push和Pop操作。队列中的元素为int类型。
解题思路及代码
栈的特点是后进先出,而队列的特点是先进先出。所以这道题的难点是完成两种顺序的转换。
入队:将元素进栈A
出队:判断栈B是否为空,如果为空,则将栈A中所有元素pop,并push进栈B,栈B出栈; 如果不为空,栈B直接出栈
- import java.util.Stack;
-
- public class Solution {
- Stack<Integer> stack1 = new Stack<Integer>();
- Stack<Integer> stack2 = new Stack<Integer>();
-
- public void push(int node) {
- stack1.push(node);
- }
-
- public int pop() {
- if(stack2.isEmpty()){
- while(!stack1.isEmpty()){
- int tmp = stack1.pop();
- stack2.push(tmp);
- }
- }
- return stack2.pop();
- }
- }
扩展
使用两个队列实现一个栈
- 解题思路 入栈: 将元素放入队列A中 出栈: 判断队列A中的元素的个数是否为1,如果等于1就出队列,否则把A中的元素出队列,然后把出队列的元素放入到B中,直到队列A中只剩下最后一个元素,然后队列A出队列。这样就完成了出栈的操作,但是原来的元素怎么处理呢?有两种思路:
- 把队列A的引用指向队列B的实例,把队列B的引用指向队列A的实例,即交换实例
- 把队列B中的元素出队列到A中
- 代码实现:
- import java.util.LinkedList;
-
- public class StackByTwoQueue {
-
- private LinkedList<String> queue1 = new LinkedList<String>();
- private LinkedList<String> queue2 = new LinkedList<String>();
-
- /*
- * 两个队列实现一个栈
- * pop完成出栈操作,push完成入栈操作
- */
- public void push(String obj) {
- if(queue1.isEmpty()){
- queue2.add(obj);
- }
- if(queue2.isEmpty()){
- queue1.add(obj);
- }
- }
- public String pop() {
- //两个栈都为空时,没有元素可以弹出
- if (queue1.isEmpty()&&queue2.isEmpty()) {
- try {
- throw new Exception("stack is empty");
- } catch (Exception e) {
- }
- }
- if(queue1.isEmpty()){
- while(queue2.size()>1){
- queue1.add(queue2.poll());
- }
- return queue2.poll();
- }
- if(queue2.isEmpty()){
- while(queue1.size()>1){
- queue2.add(queue1.poll());
- }
- return queue1.poll();
- }
- return null;
- }
-
- public static void main(String[] args) {
- StackByTwoQueue stack = new StackByTwoQueue();
- for(int i=0;i<10;i++){
- stack.push(i+"");
- }
- for(int i=0;i<20;i++){
- System.out.println(stack.pop());
- }
- }
-
- }
-