一、题目粗心
请你仅应用两个队列实现一个后入先出(LIFO)的栈,并反对一般栈的全副四种操作(push、top、pop 和 empty)。
实现 MyStack 类:
void push(int x) 将元素 x 压入栈顶。
int pop() 移除并返回栈顶元素。
int top() 返回栈顶元素。
boolean empty() 如果栈是空的,返回 true;否则,返回 false。
留神:
你只能应用队列的基本操作 —— 也就是 push to back、peek/pop from front、size 和 is empty 这些操作。
你所应用的语言兴许不反对队列。你能够应用 list(列表)或者 deque(双端队列)来模仿一个队列 , 只有是规范的队列操作即可。
示例:
输出:
[“MyStack”, “push”, “push”, “top”, “pop”, “empty”]
[[], [1], [2], [], [], []]
输入:
[null, null, null, 2, 2, false]解释:
MyStack myStack = new MyStack();
myStack.push(1);
myStack.push(2);
myStack.top(); // 返回 2
myStack.pop(); // 返回 2
myStack.empty(); // 返回 False
提醒:
- 1 <= x <= 9
- 最多调用 100 次 push、pop、top 和 empty
- 每次调用 pop 和 top 都保障栈不为空
进阶: 你是否仅用一个队列来实现栈。
二、解题思路
应用队列,每次把新退出的数插到前头,这样队列保留的程序和栈的程序是相同的,它们的取出形式也是反的,那么反反得正,就是咱们须要的程序了。我样能够间接对队列 q 操作,在队尾退出了新元素 x 后,将 x 后面所有的元素都安顿好程序取出并加到队列到开端,这样下次就能间接取出 x 了,合乎栈的后入先出的个性,其余三个操作也就是间接调用队列的操作即可。
三、解题办法
3.1 Java 实现
public class MyStack {
Queue<Integer> q;
public MyStack() {// int size():获取队列长度;//boolean add(E)/boolean offer(E):增加元素到队尾;//E remove()/E poll():获取队首元素并从队列中删除;//E element()/E peek():获取队首元素但并不从队列中删除。q = new LinkedList<>();}
public void push(int x) {q.add(x);
for (int i = 0; i < q.size() - 1; i++) {q.add(q.poll());
}
}
public int pop() {return q.poll();
}
public int top() {return q.peek();
}
public boolean empty() {return q.isEmpty();
}
}
/**
* Your MyStack object will be instantiated and called as such:
* MyStack obj = new MyStack();
* obj.push(x);
* int param_2 = obj.pop();
* int param_3 = obj.top();
* boolean param_4 = obj.empty();
*/
四、总结小记
- 2022/8/19 天气就像大姑娘的脸呀,说变就变