题目:
使用队列实现栈的下列操作:
push(x) – 元素 x 入栈
pop() – 移除栈顶元素
top() – 获取栈顶元素
empty() – 返回栈是否为空
方法一: 用两个队列q1和q2实现栈,q1用来入栈,q2用来出栈,定义一个top用来标记栈顶元素。出栈时,将q1中的n-1个元素出栈,然后从q2入栈,最后将第n个元素出栈,交换两个队列的元素
class MyStack {
Queue<Integer> q1;
Queue<Integer> q2;
int top;
/** Initialize your data structure here. */
public MyStack() {
q1=new LinkedList<>();
q2=new LinkedList<>();
}
/** Push element x onto stack. */
public void push(int x) {
top=x;
q1.offer(x);
}
/** Removes the element on top of the stack and returns that element. */
public int pop() {
while(q1.size()>1){
top=q1.poll();
q2.offer(top);
}
int x=q1.poll();
Queue q=q1;
q1=q2;
q2=q;
return x;
}
/** Get the top element. */
public int top() {
return this.top;
}
/** Returns whether the stack is empty. */
public boolean empty() {
return q1.isEmpty()&&q2.isEmpty();
}
}
方法二: 用一个队列实现栈,入栈直接从q入栈,出栈时先将q中的n-1个元素出栈后再入栈,然后将第n个元素出栈,求栈顶元素和出栈相同的方法,最后将第n个元素再出栈入栈即可
class MyStack {
Queue<Integer> q;
/** Initialize your data structure here. */
public MyStack() {
q=new LinkedList<>();
}
/** Push element x onto stack. */
public void push(int x) {
q.offer(x);
}
public void shift(){
for(int i=0;i<q.size()-1;i++){
q.offer(q.poll());
}
}
/** Removes the element on top of the stack and returns that element. */
public int pop() {
shift();
return q.poll();
}
/** Get the top element. */
public int top() {
shift();
int x=q.poll();
q.offer(x);
return x;
}
/** Returns whether the stack is empty. */
public boolean empty() {
return q.isEmpty();
}
}
来源:CSDN
作者:ZQQ~BK
链接:https://blog.csdn.net/qq_42174669/article/details/104019457