思想:
定义两个栈:一个数据栈A一个辅助栈B
添加的时候就直接添加到栈A
出栈的时候分情况:
1. 栈A只有一个元素,栈B空,直接将该元素弹出 例如添加了a则a
2.栈A有N个元素,栈B空,将栈A的N-1个元素放到辅助栈B中,A剩下最后栈底的元素,弹出 例如添加 bcdf 首次出栈 就会把fdc放到辅助栈B中,栈A则只剩下b
3.栈A有N个元素,栈B有N个元素,则将B弹出就可以了,如再添加ghj 即A有ghj B有fdc,则直接将B栈顶弹出来
总结出栈:
B不空,则直接弹出
B空的,则需要将栈A中N-1个元素放到栈B中,再弹出栈A的底层元素
public class Test01 {
public static void main(String[] args) {
Stack2Queue b = new Stack2Queue();
b.add("A");
b.add("B");
b.add("C");
System.out.println(b.poll());
b.add("D");
b.add("F");
System.out.println(b.poll());
}
}
class Stack2Queue {
/**
* 用栈的入栈和出栈
* 来实现队列的入队和出队
* stack1是入栈的,stack2是出栈的。
入队列:直接压入stack1即可
出队列:如果stack2不为空,把stack2中的栈顶元素直接弹出;
否则,把stack1的所有元素全部弹出压入stack2中,再弹出stack2的栈顶元素
* */
Stack stack1 = new Stack();
Stack stack2 = new Stack();
public void add(Object o) {
stack1.push(o);
}
public Object poll() {
Object o = null;
//DF CBF
if(stack2.size()==0) {
//把stack1的数据放入stack2,留下最后一个数据
while(stack1.size()>1) {
stack2.push(stack1.pop());
}
if(stack1.size()==1) {
//把stack1的留下的那个数据返回出去
o = stack1.pop();
}
}else {
o = stack2.pop();
}
return o;
}
}