使用栈实现队列的下列操作:
push(x) – 将一个元素放入队列的尾部。
pop() – 从队列首部移除元素。
peek() – 返回队列首部的元素。
empty() – 返回队列是否为空。
示例:
MyQueue queue = new MyQueue();
queue.push(1);
queue.push(2);
queue.peek(); // 返回 1
queue.pop(); // 返回 1
queue.empty(); // 返回 false
说明:
你只能使用标准的栈操作 – 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。
你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。
假设所有操作都是有效的 (例如,一个空的队列不会调用 pop 或者 peek 操作)。
思路:
使用两个栈,一个栈保存输入的元素,另外一个栈将前面栈中的元素保存到自己中,这样就实现了队列的效果,最先进的元素在A栈的栈底,B栈的栈顶。
push方法中直接push进A栈,pop方法中B栈push(A栈pop()),返回B栈pop;
代码:
public class Stackfromqueue232 {
private Stack<Integer> stackA;
private Stack<Integer> stackB;
public Stackfromqueue232() {
stackA = new Stack<Integer>();
stackB = new Stack<Integer>();
}
public void push(int x) {
stackA.push(x);
}
public int pop() throws RuntimeException {
if (stackA.empty() && stackB.empty()) {
throw new RuntimeException("队空");
} else if (stackB.empty()) {
while (!stackA.empty()) {
stackB.push(stackA.pop());
}
}
return stackB.pop();
}
public int peek() throws RuntimeException {
if (stackA.empty() && stackB.empty()) {
throw new RuntimeException("队空");
} else if (stackB.empty()) {
while (!stackA.empty()) {
stackB.push(stackA.pop());
}
}
return stackB.peek();
}
public boolean empty() {
return stackA.empty() && stackB.empty();
}
public static void main(String[] args) {
Stackfromqueue232 test = new Stackfromqueue232();
test.push(1);
System.out.println(test.peek());
test.push(2);
System.out.println(test.peek());
test.empty();
System.out.println(test.empty());
}
}