请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通队列的全部四种操作(push、top、pop 和 empty)。
实现 MyStack 类:
void push(int x) 将元素 x 压入栈顶。
int pop() 移除并返回栈顶元素。
int top() 返回栈顶元素。
boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。
注意:你只能使用队列的基本操作 —— 也就是 push to back、peek/pop from front、size 和 is empty 这些操作。
你所使用的语言也许不支持队列。 你可以使用 list (列表)或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。
方法1:用一个flag标记当前对哪个队列进行操作,队尾元素就是栈顶元素,
push():直接把元素放到当前队列的队尾,
pop():把除了队尾元素之外的所有元素,依次从当前队列中取出并放入另一个队列,修改flag,返回队尾元素,
top(): 把所有元素依次从当前队列中取出并放入另一个队列,并用data记录,修改flag,data最后记录的元素就是栈顶元素,
empty():看当前队列是否为空。
class MyStack {
Queue<Integer> q1;
Queue<Integer> q2;
boolean flag;
/** Initialize your data structure here. */
public MyStack() {
q1 = new LinkedList();
q2 = new LinkedList();
flag = true;
}
/** Push element x onto stack. */
public void push(int x) {
if(flag){
q1.offer(x);
}else{
q2.offer(x);
}
}
/** Removes the element on top of the stack and returns that element. */
public int pop() {
if(flag){
while(q1.size() > 1){
q2.offer(q1.poll());
}
flag = !flag;
return q1.poll();
}else{
while(q2.size() > 1){
q1.offer(q2.poll());
}
flag = !flag;
return q2.poll();
}
}
/** Get the top element. */
public int top() {
int data = -1;
if(flag){
while(q1.size() > 0){
data = q1.poll();
q2.offer(data);
}
}else{
while(q2.size() > 0){
data = q2.poll();
q1.offer(data);
}
}
flag = !flag;
return data;
}
/** Returns whether the stack is empty. */
public boolean empty() {
if(flag){
return q1.isEmpty();
}else{
return q2.isEmpty();
}
}
}
方法2:保持q1的头是栈顶元素,
push():每次压入的元素,先放入q2中,再把q1中的元素依次取出并放入q2,把q2赋给q1,q2置空;
pop():弹出q1的队列头;
top():q1的peek操作;
empty():p1是否为空。
class MyStack {
Queue<Integer> q1;
Queue<Integer> q2;
/** Initialize your data structure here. */
public MyStack() {
q1 = new LinkedList();
q2 = new LinkedList();
}
/** Push element x onto stack. */
public void push(int x) {
q2.offer(x);
while(!q1.isEmpty()){
q2.offer(q1.poll());
}
Queue<Integer> temp = q1;
q1 = q2;
q2 = temp;
}
/** Removes the element on top of the stack and returns that element. */
public int pop() {
return q1.poll();
}
/** Get the top element. */
public int top() {
return q1.peek();
}
/** Returns whether the stack is empty. */
public boolean empty() {
return q1.isEmpty();
}
}