以下内容是从网站中学习的。
使用队列实现栈的下列操作:
push(x)--元素x入栈
pop()--移除栈顶元素
top()--获取栈顶元素
empty()--返回栈是否为空
注意:
你只能使用队列的基本操作-- 也就是 push to back, peek/pop from front, size, 和 is empty 这些操作是合法的。
你所使用的语言也许不支持队列。 你可以使用 list 或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。
你可以假设所有操作都是有效的(例如, 对一个空的栈不会调用 pop 或者 top 操作)。
思路
(这里要强调是单向队列)
刚刚做过栈与队列:用栈来实现队列的同学可能依然想着用一个输入队列,一个输出队列,就可以模拟栈的功能,仔细想一下还真不行!
队列模拟栈,其实一个队列就够了。
一个队列在模拟栈弹出元素的时候只要将队列头部的元素(除了最后一个元素外)重新添加到队列尾部,此时再去弹出元素就是栈的顺序了。
使用一个Queue实现:
class MyStack{
Queue<Integer> queue;
public MyStack(){
queue = new LinkedList<>();
}
//每 offer一个数(A)进来,都重新排列,把这个数(A)放到队列的队首
public void push(int x){
queue.offer(x);//将新元素加到队尾
int size = queue.size();
//移动除了A的其他元素
while(size > 1){
queue.offer(queue.poll());
size--;
}
}
public int pop(){
return queue.poll();
}
public int top(){
return queue.peek();
}
public boolean empty(){
return queue.isEmpty();
}
}
时间复杂度:push:O(n) 其他是O(1)
空间复杂度:O(n)