232.用栈实现队列
链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
细节:
1.拿一个栈来接住
2.思路是很清晰的,你queue要干什么,我stack就干什么,一个Input的stack往里放后,判断Output的stack是不是为空,空的话就all in装进去,然后进行相关的操作
class MyQueue {
Stack<Integer>stackIn;
Stack<Integer>stackOut;
public MyQueue() {
stackIn = new Stack<>();
stackOut = new Stack<>();
}
public void push(int x) {
stackIn.push(x);
}
public int pop() {
// 如果输出栈为空,将输入栈中的元素逐个弹出并压入输出栈,以实现队列的先进先出顺序
if (stackOut.isEmpty()){
while(!stackIn.isEmpty()){
stackOut.push(stackIn.pop());
}
}
return stackOut.pop();
}
public int peek() {
if (stackOut.isEmpty()){
while(!stackIn.isEmpty()){
stackOut.push(stackIn.pop());
}
}
return stackOut.peek();
}
public boolean empty() {
return stackIn.isEmpty() && stackOut.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();
*/
225. 用队列实现栈
链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
细节:
1.queue1.offer(x)
是Java中用于将元素x
入队(添加到队列末尾)的方法。具体来说,
offer(x)
方法的作用是尝试将元素x
添加到队列中,如果队列有足够的空间,它将返回true
,表示元素成功入队;如果队列已满,它将返回false
第一步:创建两个队列
第二步:实现push() --- 压栈
先进q2进行待命
让q1中的元素进q2,实现了新进的元素都在队头(栈顶)
让q1和q2进行交换
第三步:实现pop()
q1进行出队
第四步:实现peek()
q1进行考察队头
第五步:实现empty()
q1是否为空
class MyStack {
Queue<Integer> queue1;
Queue<Integer> queue2;
public MyStack() {
queue1 = new LinkedList<>();
queue2 = new LinkedList<>();
}
// 向栈中添加元素,这里queue2就是个备份队列
// 经过一番操作,queue1其实就是栈的顺序
public void push(int x) {
queue2.offer(x);
while (!queue1.isEmpty()) {
queue2.offer(queue1.poll());
}
// 到此处,queue2就有栈的顺序了,queue为空队列,已经被搬空了
// 然后再对queue1和queue2进行交换
Queue<Integer> queueTemp;
queueTemp = queue1;
queue1 = queue2;
queue2 = queueTemp;
}
public int pop() {
return queue1.poll();
}
public int top() {
return queue1.peek();
}
public boolean empty() {
return queue1.isEmpty();
}
}
细节:
一个队列实现:
第一步:创建队列
第二步:实现push()
为了让top和pop更加方便,避免这两个操作临近操作时出错,在添加的时候就将顺序排成栈的顺序
每入队一个元素,就将前面的元素出队再入队,这样保证了队头是栈顶元素
第三步:实现pop()
排好队的队列出队
第四步:实现top()
排好队的队列查队头
第五步:实现empty()
队列是否为空
class MyStack {
Queue<Integer> queue;
public MyStack() {
queue = new LinkedList<>();
}
public void push(int x) {
queue.offer(x);
int len = queue.size() - 1;
while (len-- > 0) {
queue.offer(queue.poll());
}
}
public int pop() {
return queue.poll();
}
public int top() {
return queue.peek();
}
public boolean empty() {
return queue.isEmpty();
}
}