一.两个栈实现一个队列
思路:所有元素进stack1,然后全部出stack1并进入stack2.实现队列的先进先出即:若stack2非空,我们需要的恰好再栈顶,出栈;若要给队列添加元素,即先进sack1,要出队时,若stack2不为空就出栈,为空时就把stack1全部进栈到stack2
/**
* yy 测试java中自带的stack类
* boolean empty() 测试堆栈是否为空。
* E peek() 查看栈顶对象而不移除它。 E
* pop() 移除栈顶对象并作为此函数的值返回该对象。
* E push(E item) 把项压入栈顶。
* int search(Object o) 返回对象在栈中的位置,以 1 为基数
*/
public class StackToQuery{
Stack<String> s1 = new Stack<String>();
Stack<String> s2 = new Stack<String>();
//追加队尾
public void addTail(){
s2.push(s1.pop());
}
//计算队列的长度
public int pSize(){
return s1.size()+s2.size();
}
public void s1ToS2(){
while(!s1.isEmty()){
s2.push(s1.pop());
}
//删除对头
public String deleteHead(){
if(pSize!=0){
if(s2.size()==0){
s1ToS2();
return s2.pop();
}
}else{
system.out.println("队列不能为空");
}
}
public static void main(String args[]){
StackToQuery sq = new StackToQuery();
sq.appendTail("1");
sq.appendTail("2");
sq.appendTail("3");
system.out.println(sq.deleteHead());
system.out.println(sq.deleteHead());
sq.appendTail("4");
sq.appendTail("5");
system.out.println(sq.deleteHead());
system.out.println(sq.deleteHead());
system.out.println(sq.deleteHead());
}
}
输出 12345
二.两个队列实现一个栈
思路:所有元素进入q1,因为我们的目的是栈,也就是最先出c,儿队是从队头开始出,所有先把ab出q1并入q2,此时目标c跑到了队头,出q1。此时q1已经为空,下一个要出的是b,把a从q2出队并进q1,此时目标b在q2队头,出队........
即:把非空队列的n-1个压人空对列,剩的第n个出队...即总有一个队列为空。
ps:图片原创于剑桥offer,来自网络
输出:
4
3
6
5
2
1
栈已经为空啦,不能出栈
-1