题目:
用两个栈实现一个队列。实现两个函数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();
}
}