您的位置:首页 > Web前端

剑指Offer_07 用两个栈实现队列与 用两个队列实现栈

2016-08-22 21:06 549 查看
用两个栈实现队列与 用两个队列实现栈。
思路:1.两个栈实现队列。队列先进先出,可以使用栈1进数据,实现appendTail()方法。当队列出数据时,判断栈2是否为空,不为空,栈2.pop(),实现deletedHead()方法,为空则将栈1中数据pop后存入栈2中,实现deletedHead()方法。
![这里写图片描述](http://img.blog.csdn.net/20150728082302972?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
2。两个队列实现栈。栈先进后出,可以使用队列1进数据(判断队列1,队列2哪个有数据,若队列1(2)有数据存入队列1(2),否则随意存入一个队列,实现pop()方法。当栈弹出数据时,把队列1的数据弹出,存入队列2中(当弹出数据后队列1为空,则该数据不存入队列2,只弹出队列1),此时队列2就是栈弹出数据后的结果。
![这里写图片描述](http://img.blog.csdn.net/20150728082509430?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
代码:1.两个栈实现队列


/**
* 用两个栈实现一个队列,完成两个函数appendTail和deletedHead,分别是在队列尾部插入节点
* 和在队列头部删除节点的功能
*/
private Stack<String> stack1 = new Stack<String>();
private Stack<String> stack2 = new Stack<String>();

public void appendTail(String s){
stack1.push(s);
}
public String deletedHead() throws Exception{
if(stack2.isEmpty()){
while(!stack1.isEmpty()){
stack2.push(stack1.pop());
}
}
if(stack2.isEmpty()){
throw new Exception("队列为空,不能删除");
}
return stack2.pop();
}


2.两个队列实现栈


private LinkedList<String> queue1 = new LinkedList<String>();
private LinkedList<String> queue2 = new LinkedList<String>();

public String pop(){
String re =null;
if(queue1.size() == 0 && queue2.size() == 0){
return null;
}
if(queue2.size() == 0){
while(queue1.size() >0){
re = queue1.removeFirst();
if(queue1.size() != 0){
queue2.addLast(re);
}
}
}else if(queue1.size() == 0){
while(queue2.size() >0){
re = queue2.removeFirst();
if(queue2.size()!=0){
queue1.addLast(re);
}
}
}
return re;
}
public String push(String str){
if(queue1.size() ==0 && queue2.size() == 0){
queue1.addLast(str);
}else if(queue1.size()!=0){
queue1.addLast(str);
}else if(queue2.size()!=0){
queue2.addLast(str);
}
return str;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: