-
题目
使用队列实现栈的下列操作:
push(x) – 元素 x 入栈
pop() – 移除栈顶元素
top() – 获取栈顶元素
empty() – 返回栈是否为空 -
注意
你只能使用队列的基本操作-- 也就是 push to back, peek/pop from front, size, 和 is empty 这些操作是合法的。
你所使用的语言也许不支持队列。 你可以使用 list 或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。
你可以假设所有操作都是有效的(例如, 对一个空的栈不会调用 pop 或者 top 操作)。 -
实现代码
import java.util.ArrayDeque;
import java.util.Queue;
public class MyStack {
private Queue<Integer> data, back;
/** Initialize your data structure here. */
public MyStack() {
data = new ArrayDeque<>();
back = new ArrayDeque<>();
}
/** Push element x onto stack. */
public void push(int x) {
data.add(x);
}
/** Removes the element on top of the stack and returns that element. */
public int pop() {
//若data队列只有一个元素直接弹出
if(data.size()==1){
return data.poll();
}else if(data.size()>1){
//data队列元素个数大于1,移除data队列的前n-1个元素到back队列
while (data.size()>1){
back.add(data.poll());
}
return data.poll();
}else{
//若data队列为空,需要弹出back队列最后一个元素,移除back队列的前n-1个元素到data队列
while (back.size()>1){
data.add(back.poll());
}
Queue<Integer> temp = new ArrayDeque<>();
//交换back和data队列,保持push操作的元素始终入data队列
temp = data;
data = back;
back = temp;
return data.poll();
}
}
/** Get the top element. */
public int top() {
if(data.size()==1){
return data.peek();
}else if(data.size()>1){
while (data.size()>1){
back.add(data.poll());
}
return data.peek();
}else{
while (back.size()>1){
data.add(back.poll());
}
Queue<Integer> temp = new ArrayDeque<>();
temp = data;
data = back;
back = temp;
return data.peek();
}
}
/** Returns whether the stack is empty. */
public boolean empty() {
return data.isEmpty()&&back.isEmpty();
}
}
4.上述实现代码是在弹出元素的时候,调整元素顺序。另一种实现方式是每次push元素的时候,调整在队列当中的顺序。
class MyStack {
public LinkedList<Integer> dataQueue;
public int size = 0;
/** Initialize your data structure here. */
public MyStack() {
dataQueue = new LinkedList<>();
}
/** Push element x onto stack. */
public void push(int x) {
LinkedList<Integer> tempQueue = new LinkedList<>();
//刚刚push的元素在临时队列的队头
tempQueue.offer(x);
while (!dataQueue.isEmpty()){
tempQueue.offer(dataQueue.poll());
}
while (!tempQueue.isEmpty()){
dataQueue.offer(tempQueue.poll());
}
size++;
}
/** Removes the element on top of the stack and returns that element. */
public int pop() {
size--;
return dataQueue.poll();
}
/** Get the top element. */
public int top() {
return dataQueue.peek();
}
/** Returns whether the stack is empty. */
public boolean empty() {
return size==0;
}
}