使用队列实现栈的下列操作:
push(x) -- 元素 x 入栈
pop() -- 移除栈顶元素
top() -- 获取栈顶元素
empty() -- 返回栈是否为空
喜欢的方法:一个队列, 压入 - O(n), 弹出 -O(1)
设一个队列,根据FIFO,将前面的元素移出来,又移进去从而实现栈。(个人决定这个方法很好,易懂简洁)
import java.util.LinkedList;
import java.util.Queue;
class MyStack {
private Queue<Integer> q1;
public MyStack() {
q1 = new LinkedList<Integer>();
}
// 一个队列,压入O(n),弹出O(1)
public void push(int x) {
q1.add(x);
int sz = q1.size();
//剩最后进的元素在队列中,然后将前面的元素移出来又加进去
while (sz > 1) {
q1.add(q1.remove());
sz--;
}
}
public int pop() {
return q1.remove();
}
public int top() {
return q1.peek();
}
public boolean empty() {
return q1.isEmpty();
}
}
另外push()也可以设一个动态数组,将原有的元素移到数组里,等添加完了x,再依次添加进来也是ok的。
public void push(int x) {
ArrayList<Integer> list = new ArrayList<>();
while (!queue.isEmpty()) {
list.add(queue.poll());
}
queue.add(x);
for (int i = 0; i < list.size(); i++) {
queue.add(list.get(i));
}
}
其余的一个思路:两个队列
先创建一个队列,加入元素;然后pop()中再设一个临时队列2:队列1不为空的情况下,将其中元素移到队列2里面,这个时候仍然FIFO,但是将队列2的元素,只剩最后一个,其余又移到队列1里面去,再return queue2中剩下的那一个即可实现pop。
top()的话,依然再设一个临时队列,不过还得设一个temp来指向按栈的FILO意思的第一个元素(如果队列123,那么栈就是321,top为3),但是top()和pop()的区别在于:pop()是要移除,top需要拿来看一眼,不作修改。我们先用temp来记录queue1.peek(),再将队列1的元素全部转移到队列2中。最后还要让队列2赋给队列1来保持原样。return temp。
class Mystack1 {
private Queue<Integer> queue1;
public Mystack1() {
queue1 = new LinkedList<>();
}
public void push(int x) {
queue1.add(x);
}
public int pop() {
Queue<Integer> queue2 = new LinkedList<>();
while (!queue1.isEmpty()) {
queue2.add(queue1.poll());
}
for (int i = 0; i < queue1.size() - 1; i++) {
queue1.add(queue2.poll());
}
return queue2.peek();
}
public int top() {
Queue<Integer> queue2 = new LinkedList<>();
int temp = 0;
while (!queue1.isEmpty()) {
temp = queue1.peek();
queue2.add(queue1.poll());
}
queue1 = queue2;
return temp;
}
public boolean empty() {
return queue1.isEmpty();
}
}
end.