思路:利用两条队列来模拟实现栈的操作
public class Mypork {
Queue<Integer> A = new LinkedList<>();
Queue<Integer> B = new LinkedList<>();
//1入栈
//入栈和入队列的操作都是一样的,基于链表都是尾插或者头插
public void push(int x){
A.offer(x);
}
//2.出栈
public Integer pop(){
if(A.isEmpty()){
return null;
}
while(A.size()>1){
B.offer(A.poll());//将A队列中的队尾元素之前的所有元素全部出队列到B队列中
}
Integer a = A.poll();//再将队尾元素保存下来
changeAB();//再交换AB队列的身份,让A队列永远都是保存元素的那条
return a;
}
//3.取栈顶元素
public Integer peek(){
if(A.isEmpty()){
return null;
}
while(A.size()>1){
B.offer(A.poll());
}
Integer a = A.poll();
B.offer(a);;//再将这个栈顶元素还原到原先队列中
changeAB();
return a;
}
//4.判断栈是否为null
public boolean empty(){
return A.isEmpty();
}
public void changeAB(){//交换AB的身份
Queue<Integer> tmp = A;
A = B;
B = tmp;
}
}
思路:队列的特性是先进先出,基于链表也就是尾插头删或者头插尾删,而栈的特性是后进先出,基于链表也就是尾插尾删或者头插头删。对于入栈来说和入队列都是一样的,我们假设是尾插;对于队列来说出栈操作相等于是出队列的最后一个元素,把前面的元素全部出队列到B队列中,然后剩下的那个元素就是出栈元素。然后再把AB队列身份交换。取栈顶元素和出栈类似,不过出栈元素需要还原到队列中。A队列为null得时候代表出栈出完了,所以A队列为null就是栈为null。
该博客介绍了一种使用两个队列实现栈功能的方法。通过入队、出队操作,模拟栈的入栈、出栈和查看栈顶元素。在栈为空时,A队列为空。核心操作包括身份交换AB队列以保持栈特性。
1039

被折叠的 条评论
为什么被折叠?



