链接👇
用队列实现栈
思路:创建两个栈,一个用作导元素,一个用来存放元素。入栈时,先把元素放入a中,如果b中不为空则把b中元素全部放入a中,此时b中的元素本来在对头,放入a后就在队尾了,然后ab调换,让a中为空,b中存放元素,就相当于完成了一次压栈。比如(入栈顺序为1 2,1先放入a中,b为空,然后调换ab,b中为1,a为空,2放入a中,b不为空,把b中的1放入a中,然后调换ab,此时a为空,b中为21);
1.创建两个队列
Queue<Integer> a;
Queue<Integer> b;
public MyStack() {
a = new LinkedList<>();
b = new LinkedList<>();
}
2.元素先入a,b中不为空时,b中元素全部入a,然后ab转换
public void push(int x) {
//先将元素放到a或者b中 以下是放入a中的写法
a.offer(x);
//当b中不为空时,b中元素全部入a
while(!b.isEmpty()){
a.offer(b.poll());
}
//交换ab 保证了a中为空,
//while和交换ab,完成了对b的压栈(最开始的元素已经在b的队尾(栈底)了)
Queue<Integer> ret = a;
a = b;
b = ret;
}
完整代码👇
class MyStack {
Queue<Integer> a;
Queue<Integer> b;
public MyStack() {
a = new LinkedList<>();
b = new LinkedList<>();
}
public void push(int x) {
//先将元素放到a或者b中 以下是放入a中的写法
a.offer(x);
//当b中不为空时,b中元素全部入a
while(!b.isEmpty()){
a.offer(b.poll());
}
//交换ab 保证了a中为空,
//while和交换ab,完成了对b的压栈(最开始的元素已经在b的队尾(栈底)了)
Queue<Integer> ret = a;
a = b;
b = ret;
}
public int pop() {
return b.poll();
}
public int top() {
return b.peek();
}
public boolean empty() {
return (a.isEmpty() && b.isEmpty());
}
}
如果对你有帮助的话一键三连!
运行结果👇