1. 实现原理
一个队列加入元素,弹出元素时,需要把队列中的 元素放到另外一个队列中,删除最后一个元素;
两个队列始终保持只有一个队列是有数据的
2. 示意图
image.png3. 代码实现
public class TwoQToS<T> {
public static void main(String[] args) {
MyStack<Integer> stack = new MyStack<Integer>();
stack.push(1);
stack.push(2);
stack.push(3);
stack.push(4);
stack.push(5);
try {
System.out.println(stack.pop());
System.out.println(stack.pop());
System.out.println(stack.pop());
System.out.println(stack.pop());
System.out.println(stack.pop());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
stack.push(10);
stack.push(11);
try {
System.out.println(stack.pop());
System.out.println(stack.pop());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
class MyStack<T> {
private Queue<T> queue1;
private Queue<T> queue2;
public MyStack() {
queue1 = new LinkedList<>();
queue2 = new LinkedList<>();
}
/**
* 压栈
*
* 入栈非空的队列
*/
public boolean push(T t) {
if (!queue1.isEmpty()) {
return queue1.offer(t);
} else {
return queue2.offer(t);
}
}
/**
* 出栈
* @throws Exception
*
*/
public T pop() throws Exception {
if (queue1.isEmpty() && queue2.isEmpty()) {
throw new Exception("队列中没有数据");
}
if (!queue1.isEmpty() && queue2.isEmpty()) {
while (queue1.size() > 1) {
queue2.offer(queue1.poll());
}
return queue1.poll();
}
if (!queue2.isEmpty() && queue1.isEmpty()) {
while (queue2.size() > 1) {
queue1.offer(queue2.poll());
}
return queue2.poll();
}
return null;
}
@Override
public String toString() {
return this.queue1.toString() + ", " + this.queue2.toString();
}
}
运行结果
5
4
3
2
1
11
10
网友评论