题目
使用队列实现栈的下列操作:
push(x) – 元素 x 入栈
pop() – 移除栈顶元素
top() – 获取栈顶元素
empty() – 返回栈是否为空
注意:
你只能使用队列的基本操作-- 也就是 push to back, peek/pop from front, size, 和 is empty 这些操作是合法的。
你所使用的语言也许不支持队列。 你可以使用 list 或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。
你可以假设所有操作都是有效的(例如, 对一个空的栈不会调用 pop 或者 top 操作)。
思路
栈是一种 后进先出的数据结构,栈内元素从顶端压入(push),从顶端弹出(pop)。一般我们用数组或者链表来实现栈。队列是一种与栈相反的 先进先出的数据结构,队列中元素只能从 后端(rear)入队(push),然后从 前端(front)端出队(pop)。为了满足栈的特性,我们需要维护两个队列 q1 和 q2。同时,我们用一个额外的变量来保存栈顶元素。
- 创建两个队列q1,q2
- 栈的push操作:就直接是q1.push 放到q1队列的尾上,用top标记
- 栈的pop操作:q1不为空,那么将q1的元素拿出来放到q2,只剩下一个元素在q1,此时q1最后的元素就是需要pop的元素,删除并拿出来。将q1,q2互换,这样q1就完成了pop。
- 栈的top: 前面用top标记了栈顶元素,直接返回top
代码
public class LC225 {
// 用队列实现栈
private Queue<Integer> q1 = new LinkedList<>();
private Queue<Integer> q2= new LinkedList<>();
int top;
public LC225 () {
}
// 放入元素X到栈顶
public void push(int x) {
q1.add(x);
top=x;
}
public int pop() {
int x;
while(q1.size()>1) { //循环结束,top指向栈顶元素
top= q1.remove();
q2.add(top);
}
x=q1.remove();
Queue<Integer> temp=q1;
q1=q2;
q2=temp;
return x;
}
public int top() {
return top;
}
public boolean empty() {
if(q1.size()==0) {
return false;
}
return true;
}