用队列实现栈
思路
1.用两个队列,一个队列用来存数,另一个队列用来取。即一个队列正常存取,另一个队列在栈pop及top操作时取出另一个队列的最后一个数字,也即每次遍历队列。
2.题解给的方法,是在存入的时候就进行逆置,这样一来pop及top操作就比较方便。
总结
写代码的时候把Deque双端队列及Qeque单向队列搞混淆了。qeque的存取操作分别为offer及poll。而deque的存取操作为push及pop。
Queue
的实现类有很多(如 LinkedList
、ArrayDeque
)
代码
出栈操作时,进行遍历操作。
class MyStack {
Queue<Integer> qeque1;
Queue<Integer> qeque2;
public MyStack() {
qeque1=new ArrayDeque<>();
qeque2=new ArrayDeque<>();
}
public void push(int x) {
qeque1.offer(x);
}
public int pop() {
while (!qeque1.isEmpty()){
qeque2.add(qeque1.poll());
}
int temp =0;
while (!qeque2.isEmpty()){
temp=qeque2.poll();
if (!qeque2.isEmpty()) qeque1.add(temp);
}
return temp;
}
public int top() {
while (!qeque1.isEmpty()){
qeque2.add(qeque1.poll());
}
int temp =0;
while (!qeque2.isEmpty()){
temp=qeque2.poll();
qeque1.add(temp);
}
return temp;
}
public boolean empty() {
return qeque1.isEmpty();
}
}
入栈操作时进行逆置操作。
class MyStack {
Queue<Integer> queue1;
Queue<Integer> queue2;
public MyStack() {
queue1 = new LinkedList<Integer>();
queue2 = new LinkedList<Integer>();
}
public void push(int x) {
queue2.offer(x);
while (!queue1.isEmpty()) {
queue2.offer(queue1.poll());
}
Queue<Integer> temp = queue1;
queue1 = queue2;
queue2 = temp;
}
public int pop() {
return queue1.poll();
}
public int top() {
return queue1.peek();
}
public boolean empty() {
return queue1.isEmpty();
}
}