使用队列实现栈的push、pop、top、empty这四个接口功能
队列的特点:先进先出,和栈先进后出相反,那么怎么使用队列实现相反操作顺序的栈呢?
其主要原理是在出栈时将原队列queue1除了队首的元素之外所有元素都按照顺序依次缓存到另外一个队列queue2,单独对队列末端元素出队并记录为e,最后将queue2队列元素全部放回原队列并返回末端元素e
这里考虑top()查看栈顶的方法会经常调用,使用变量Integer top; 对其缓存,把复杂度降为O(1);未改动的top()操作文末贴出。
package com.my.algorithm.leetcode;
import java.util.LinkedList;
import java.util.Queue;
/**
*
* 使用双对列实现栈
*
* @date: 2021/3/28 13:56
* @author: JiGang Q
*/
public class MyStack {
private Queue<Integer> queue1;
private Queue<Integer> queue2;
Integer top;
/** Initialize your data structure here. */
public MyStack() {
queue1 = new LinkedList<>();
queue2 = new LinkedList<>();
}
/** Push element x onto stack. */
public void push(int x) {
top = x;
queue1.add(x);
}
/** Removes the element on top of the stack and returns that element. */
public int pop() {
int size = queue1.size();
for (int i = 0; i < size - 1; i++) {
Integer integer = queue1.remove();
if (i == size-2) {
top = integer;
}
queue2.add(integer);
}
Integer e = queue1.remove();
for (int i = 0; i < size - 1; i++) {
queue1.add(queue2.remove());
}
return e;
}
/** Get the top element. */
public int top() {
return top;
}
/** Returns whether the stack is empty. */
public boolean empty() {
return queue1.isEmpty();
}
}
pop
public int pop() {
int size = queue1.size();
for (int i = 0; i < size - 1; i++) {
Integer integer = queue1.remove();
if (i == size-2) {
top = integer;
}
queue2.add(integer);
}
Integer e = queue1.remove();
for (int i = 0; i < size - 1; i++) {
queue1.add(queue2.remove());
}
return e;
}