力扣:用栈实现队列
题目
解题
class MyQueue {
Deque<Integer> inStack;
Deque<Integer> outStack;
public MyQueue() {
inStack = new ArrayDeque<Integer>();
outStack = new ArrayDeque<Integer>();
}
public void push(int x) {
inStack.push(x);
}
public int pop() {
if(outStack.isEmpty()){
while(!inStack.isEmpty()){
outStack.push(inStack.pop());
}
}
return outStack.pop();
}
public int peek() {
if(outStack.isEmpty()){
while(!inStack.isEmpty()){
outStack.push(inStack.pop());
}
}
return outStack.peek();
}
public boolean empty() {
if(inStack.isEmpty() && outStack.isEmpty()){
return true;
}
return false;
}
}
思路
首先我们了解队列规律是“先进先出”,而栈的规律是“先进后出”,所以用一个栈的话模拟不出来队列的功能。
而想要模拟出来队列的话就需要改变栈的出的顺序,这样我们就可以用两个栈,一个为出栈,一个为入栈。当有元素要进入的时候就加入到入栈中,然后当有元素要出的时候,就把入栈的元素加入到出栈中,这样就可以把入栈最下面的元素变为出栈最上面的元素,这样顺序就没有错了。
画图说明:
所以上面的各个方法中就pop
和peak
方法需要注意的是,入栈的元素加入到出栈元素的时机。只有当我们出栈元素为空的时候才能将当前入栈中所有元素加入到出栈中,而不是每次出栈都是将入栈的加入到出栈的,这样会影响到整体的顺序,就比如先加入1、2、3
中三个元素,然后要出队列了,就转移到出栈中,然后把1
弹出,这时加入4
,然后要出队列,这时把4
加入到出栈就会弹出4导致顺序错误。
我们可以理解为每一次出栈为空把入栈转移过来之后,就把当前的一个状态给记录下来了,保证了当前所有元素的有序性,而需要把这段有序的给全部出完之后,再传入下一段有序的。
原文地址:https://blog.csdn.net/sahuid/article/details/142290584
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!