思路
- 主要是在出栈和取栈顶元素问题上
- 只要明确,出栈出的就是队列的队尾元素,所以只要获取到队列的队尾元素即可(如果不理解可以画一个栈和一个队,入相同的元素,可以发现栈顶即是队尾)
- 取栈顶元素就是取到队列的队尾元素
- 实现上,我们创建两个队列A,和B。A中始终保存入队的元素。将A中的元素挪到B中,当A中只剩一个元素时,也就是我们想要的队尾,即出栈的元素,也就是栈顶,将其保存返回即可,此时所有的元素在B中,我们再将A,B交换,始终保证A中是存入队的元素。
代码
//用两个队列实现栈
class MyStack {
private Queue<Integer> A=new LinkedList<>();
private Queue<Integer> B=new LinkedList<>();
public MyStack() {
}
//入栈
public void push(int x) {
A.offer(x);
}
//出栈
//也就是删除队尾元素
public int pop() {
if(A.isEmpty()&&B.isEmpty()){
return 0;
}
while(A.size()>1){
int ret=A.poll();
B.offer(ret);
}
int result=A.poll();
//再将A和B交换
Queue<Integer> c=new LinkedList<>();
c=A;
A=B;
B=c;
return result;
}
//取栈顶元素
//也就是将队尾的元素获取到
public int top() {
if(A.isEmpty()&&B.isEmpty()){
return 0;
}
while(A.size()>1){
int ret=A.poll();
B.offer(ret);
}
int result=A.poll();
B.offer(result);
Queue<Integer> c=new LinkedList<>();
c=A;
A=B;
B=c;
return result;
}
//判断栈是否空
//也就是判断队里面还有没有元素
public boolean empty() {
return A.isEmpty();
}
}