题目一:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入节点和在队列头部删除节点的功能。
public static class SQueue<T> {
private Stack<T> stack1 = new Stack<T>();
private Stack<T> stack2 = new Stack<T>();
void appendTail(T data) {
stack1.push(data);
}
T deleteHead() {
if (stack1.isEmpty() && stack2.isEmpty())
return null;
if (stack2.isEmpty()) {
int size = stack1.size();
for (int i=0; i<size; i++)
stack2.push(stack1.pop());
}
return stack2.pop();
}
boolean isEmpty() {
return stack1.isEmpty() && stack2.isEmpty();
}
int size() {
return stack1.size() + stack2.size();
}
}
题目二:用两个队列实现一个栈。队列的声明如下,请实现它的两个函数 push 和 pop 。
public static class QStack<T> {
private SQueue<T> queue1 = new SQueue<T>();
private SQueue<T> queue2 = new SQueue<T>();
void push(T data) {
queue1.appendTail(data);
}
T pop() {
if (queue2.isEmpty() && queue1.isEmpty())
return null;
if (queue2.isEmpty()) {
move(queue1, queue2);
return queue1.deleteHead();
} else {
move(queue2, queue1);
return queue2.deleteHead();
}
}
private void move(SQueue<T> q1, SQueue<T> q2) {
if (q1.size() != 1) {
int size = q1.size();
for (int i=0; i<size-1; i++)
q2.appendTail(q1.deleteHead());
}
}
}