题目:栈 —(简单)— 用队列实现栈
思路:
可以利用双队列解决,比如A、B两个队列,若开始入栈时将元素入队列A,则弹栈时,将队列A的元素都依次出队到队列B中,由于队列先进先出的原则,所有入到队列B中的元素顺序是与原来在A中是保持一致的。把最后一个出队列A的元素弹出即可,下次入栈操作时则将元素入队列B,这样让A、B反复交换作为承载栈元素的主体。查看栈顶元素top()函数的规则和弹栈规则一样。
代码:
class MyStack {
private Queue<Integer> queue;
private Queue<Integer> queue_temp;
/** Initialize your data structure here. */
public MyStack() {
queue = new LinkedList<>();
queue_temp = new LinkedList<>();
}
/** Push element x onto stack. */
public void push(int x) {
if (queue.isEmpty()) {
queue_temp.offer(x);
} else {
queue.offer(x);
}
}
/** Removes the element on top of the stack and returns that element. */
public int pop() {
if (queue.isEmpty()) {
while (queue_temp.size() > 1) {
queue.offer(queue_temp.poll());
}
return queue_temp.poll();
} else {
while (queue.size() > 1) {
queue_temp.offer(queue.poll());
}
return queue.poll();
}
}
/** Get the top element. */
public int top() {
int result = 0;
if (queue.isEmpty()) {
while (queue_temp.size() > 0) {
result = queue_temp.poll();
queue.offer(result);
}
} else {
while (queue.size() > 0) {
result = queue.poll();
queue_temp.offer(result);
}
}
return result;
}
/** Returns whether the stack is empty. */
public boolean empty() {
if (queue.isEmpty())
return queue_temp.isEmpty();
else
return queue.isEmpty();
}
}