一、题目粗心
请你仅应用两个队列实现一个后入先出(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 天气就像大姑娘的脸呀,说变就变