如果是只有一个元素的话,对于栈和队列而言,那么就可以认为入队、出队过程约等于进栈、出栈过程(仅仅是个人觉得,都只对一个元素在操作)
在这种情况下,可以直接把这个元素放进主队列中
如果不是第一个元素,后面的元素就需要用到辅助队列了,我的想法是把后来的元素先放进辅助队列,然后依次把主队列中已有的元素出队,并且入队到辅助队列中,图解一下:
如果这个时候1已经在主队列中了,2要入队就要先进入辅助队列
把主队列中所有的元素出队,并且放入辅助队列中:
这时候交换两个队列,先看一下交换后的效果:
这里交换的时候需要注意一个点,不要使用如下代码来交换(惨痛的教训):
mainQueue = supportQueue;
supportQueue.clear();
后来debug的时候发现,第一行代码确实可以做到把主队列赋值为与辅助队列相同的结果
但是第二步执行完成之后发现,居然都被clear了
原因是他们是引用数据类型,并且mainQueue = supportQueue;使他们的hashcode是相同的,都指向了同一个内存地址,也就是说如果执行clear都会被执行
正确的方法(这里只说说我改正后的方法)
mainQueue.addAll(supportQueue);
supportQueue.clear();
将辅助队列的元素全部加入到主队列,再清空就可以了
public class QStack {
Queue<Integer> mainQueue;
Queue<Integer> supportQueue;
public QStack() {
mainQueue = new LinkedList<>();
supportQueue = new LinkedList<>();
}
public void push(int x) {
if (mainQueue.isEmpty())
mainQueue.offer(x);
else{
supportQueue.offer(x);
while(!mainQueue.isEmpty())
supportQueue.offer(mainQueue.poll());
mainQueue.addAll(supportQueue);
supportQueue.clear();
}
}
public int pop() {
return mainQueue.isEmpty() ? -1 : mainQueue.poll();
}
public int top() {
return mainQueue.isEmpty() ? -1 : mainQueue.peek();
}
public boolean empty() {
return mainQueue.isEmpty();
}
public static void main(String[] args) {
QStack qStack = new QStack();
System.out.println("为空?" + qStack.empty());
qStack.push(1);
qStack.push(2);
qStack.push(3);
System.out.println("栈顶:" + qStack.top());
System.out.println("弹出:" + qStack.pop());
System.out.println("为空?" + qStack.empty());
System.out.println("弹出:" + qStack.pop());
System.out.println("弹出:" + qStack.pop());
System.out.println("为空?" + qStack.empty());
}
完全符合了栈(后进先出)的特点
原文:https://www.cnblogs.com/we1yu4n/p/14743033.html