文档讲解:代码随想录(代码随想录)
完成状态: true
232. 用栈实现队列
在push数据的时候,只要数据放进输入栈就好,但在pop的时候,操作就复杂一些,输出栈如果为空,就把输入栈数据全部导入进来(注意是全部导入),再从输出栈弹出数据,如果输出栈不为空,则直接从出栈弹出数据就可以了。
class MyQueue {
private Stack<Integer> stackIn; //输入栈
private Stack<Integer> stackOut; // 输出栈
public MyQueue() {
stackIn = new Stack<>();
stackOut = new Stack<>();
}
public void push(int x) {
stackIn.push(x); // int->Integer 自动装箱
}
public int pop() {
if(stackOut.isEmpty()){
while(!stackIn.isEmpty()){
stackOut.push(stackIn.pop());
}
}
int result = stackOut.pop(); // Integer->int 自动拆箱
return result;
}
public int peek() {
int result = this.pop();
stackOut.push(result);
return result;
}
public boolean empty() {
if(stackIn.isEmpty() && stackOut.isEmpty()){
return true;
}
return false;
}
}
225. 用队列实现栈
惯性思维不行了。用一个输入队列,一个输出队列,已经不可以模拟栈的功能了。
跳出惯性思维,我们用两个队列模拟栈的时候,只需要每次让第一个队列中最后一个元素弹出即可,而这个过程中,最后一个元素前的所有元素都会在队列一中出队,所有需要第二个队列来保存这些元素,在队列一完成弹出最后一个元素后又将队列二中备份的元素放回队列一即可。
class MyStack {
private Queue<Integer> queue1; // 保证和栈中元素顺序一样的队列
private Queue<Integer> queue2; // 辅助队列,用于备份
public MyStack() {
queue1 = new LinkedList<>();
queue2 = new LinkedList<>();
}
public void push(int x) {
queue1.offer(x);
}
public int pop() {
int size = queue1.size();
size--;
while(size > 0){
queue2.offer(queue1.poll());
size--;
}
int result = queue1.poll();
while(!queue2.isEmpty()){
queue1.offer(queue2.poll());
}
return result;
}
public int top() {
int result = this.pop();
queue1.offer(result);
return result;
}
public boolean empty() {
return queue1.isEmpty();
}
}
其实这道题目就是用一个队列就够了。
一个队列在模拟栈弹出元素的时候只要将队列头部的元素(除了最后一个元素外) 重新添加到队列尾部,此时再去弹出元素就是栈的顺序了。
class MyStack {
private Queue<Integer> queue;
public MyStack() {
queue = new LinkedList<>();
}
public void push(int x) {
queue.offer(x);
}
public int pop() {
int size = queue.size();
size--;
while(size > 0){
queue.offer(queue.poll());
size--;
}
int result = queue.poll();
return result;
}
public int top() {
int result = this.pop();
queue.offer(result);
return result;
}
public boolean empty() {
return queue.isEmpty();
}
}