面试题9:用两个栈实现队列

时间:2023-03-06 20:02:57


题目:

用两个栈实现一个队列。实现两个函数appendTail()和deleteHead(),分别完成在队列尾部插入结点和队列头部删除结点的功能。

分析:

根据栈和队列的性质,我们知道,栈是后进先出,队列的先进先出。现在我们要用两个栈来实现队列。

假设有a,b,c三个元素入队列,依次将它们放入stack1,此时栈顶是c,栈底是a,现在需要执行队列的出队操作,按照先进先出的原则,第一个出队的应该是a,可是a位于栈底,这时候,就需要借助stack2了,将数据依次从stack1里弹出并放入stack2,在stack2里面,a位于栈顶,c位于栈底,这时候,执行出队操作,即对stack2执行出栈操作。

解法:

package com.wsy;

import java.util.Stack;

class Queue {
private Stack stack1;
private Stack stack2;

public Queue() {
stack1 = new Stack();
stack2 = new Stack();
}

public void appendTail(int value) {
stack1.push(value);
}

public void deleteHead() {
if (stack2.empty()) {
while (!stack1.empty()) {
stack2.push(stack1.pop());
}
}
if (stack2.empty()) {
System.out.println("queue is empty!");
} else {
System.out.println("delete " + stack2.pop());
}
}
}

public class Main {
public static void main(String[] args) {
Queue queue = new Queue();
queue.appendTail(1);
queue.appendTail(2);
queue.appendTail(3);
queue.deleteHead();
queue.deleteHead();
queue.appendTail(4);
queue.deleteHead();
}
}

可以使用两个栈实现队列,也可以试试用两个队列实现栈。

对于入栈操作,将value直接放入queue1。

对于出栈操作,这时候就要用到queue2了,先判断queue1中的元素的个数,如果个数为1,那么queue1直接出队列就完成了出栈,如果queue1中元素的个数大于1个,那么queue1执行出队列操作,并把数据放进queue2中,queue1中留下之后一个元素不出队列,queue1中最后一个元素出队列,但是并不放到queue2中,这时候就完成了出栈的操作,最后再把queue2中的元素出队列,放到queue1中,也就是还原之前的元素。

package com.wsy;

import java.util.LinkedList;
import java.util.Queue;

class Stack {
private Queue queue1;
private Queue queue2;

public Stack() {
queue1 = new LinkedList();
queue2 = new LinkedList();
}

public void push(char value) {
queue1.add(value);
System.out.println(value + "入栈");
}

public void pop() {
if (queue1.isEmpty()) {
System.out.println("栈为空");
return;
}
if (queue1.size() == 1) {
System.out.println(queue1.poll() + "出栈");
return;
}
while (queue1.size() > 1) {
queue2.add(queue1.poll());
}
System.out.println(queue1.poll() + "出栈");
while (!queue2.isEmpty()) {
queue1.add(queue2.poll());
}
}
}

public class Main {
public static void main(String[] args) {
Stack stack = new Stack();
stack.push('a');
stack.push('b');
stack.push('c');
stack.pop();
stack.pop();
stack.pop();
stack.pop();
}
}