栈的特点是先进后出,队的特点是先进先出。两个栈将底部拼接到一起就能实现队列的效果。那么具体如何实现呢?
先看题意:
请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的操作(push,pop,peek,empty):
实现 MyQueue类:
void push(int x):将元素x进入队列的尾部
int pop():从队列的开头移除并返回元素
int peek():返回队列开头的元素
void in_out():将一个栈中的元素逆序放入另外一个栈中。
boolean empty():判断队列是否为空,为空则返回true,否则返回false。
思路:将一个栈当作输入栈,用于压入push传入的数据, 将另外一个栈当做输出栈,用于执行元素的出队列,当要出队列时先判断栈是否为空,为空则将输入栈中的元素逆序放入输出栈中,然后再从输出栈中输出元素,即为出队列元素。
具体代码如下:
class MyQueue{
Deque<Integer> inStack;
Deque<Integer> outStack;
public MyQueue() {
inStack = new LinkedList<Integer>();
outStack = new LinkedList<Integer>();
}
//入队列
public void push(int x) {
inStack.push(x);
}
//将栈inStack中的元素倒入outStack中
public void in_out() {
while(!inStack.isEmpty()) {
outStack.push(inStack.pop());
}
}
//出队列,从outStack中取出的顺序即为出队列的顺序
public int pop() {
if(outStack.isEmpty()) {
in_out();
}
return outStack.pop();
}
//返回队列的第一位元素,但不出队列
public int peek() {
if(outStack.isEmpty()) {
in_out();
}
return outStack.peek();
}
// 判断队列是否为空
public boolean empty() {
return inStack.isEmpty() && outStack.isEmpty();
}
}