题目:
请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):
实现 MyQueue 类:
void push(int x) 将元素 x 推到队列的末尾int pop() 从队列的开头移除并返回元素int peek() 返回队列开头的元素boolean empty() 如果队列为空,返回 true ;否则,返回 false
思路
使用双栈。
将一个栈当作入列的栈,用于压入 push 传入的数据;
另一个栈当作出列的栈,用于 pop 和 peek 操作。
代码:
class MyQueue {Stack<Integer> inStack ;Stack<Integer> outStack ;//将一个栈当作入列的栈,用于压入 push 传入的数据;//另一个栈当作出列的栈,用于 pop 和 peek 操作。public MyQueue() {outStack = new Stack<>();inStack = new Stack<>();}public void push(int x) {inStack.push(x);}public int pop() {//出列的栈为空,则需要从入列的栈取到数据if (outStack.isEmpty()) {//入列的栈非空,就把所有入列的栈转入到出列的栈inToOut();}return outStack.pop();}/**把所有入列的栈数据,转入到出列的栈*/public void inToOut() {//这里要判断,入列的栈,是否已经为空while (!inStack.isEmpty()) {outStack.push( inStack.pop());}}/**查看出列的栈数据*/public int peek() {if (outStack.isEmpty()) {inToOut();} return outStack.peek();}public boolean empty() {return inStack.isEmpty() && outStack.isEmpty();}
}/*** Your MyQueue object will be instantiated and called as such:* MyQueue obj = new MyQueue();* obj.push(x);* int param_2 = obj.pop();* int param_3 = obj.peek();* boolean param_4 = obj.empty();*/