《剑指Offer--栈-队列》

用两个栈来实现队列:*栈的结构是先进后出,队列的结构是先进先出,那么可以用两个栈来实现一个队列的结构,先将一组元素(abcdef)压入到一个栈1中,再出栈压入栈2中(fedcba),就实现了队列的:
代码如下:*

package t1;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.Stack;

public class Stack_Queue {
    //两个栈来实现一个队列
    static Stack s1 = new Stack();
    static Stack s2 = new Stack();
    //先入s1
    static void add(String str){
        for(char c : str.toCharArray()) {
            s1.push(c);
        }
    }
    //在从s1中弹出,压入s2中
    static void deleteHead() {
        if(s2.empty()) {
            while(!s1.empty()){
                s2.push(s1.pop());
            }
        }
        if(s2.empty()) System.out.println("Queue is empty");
        else 
            while(!s2.empty())
                System.out.print(s2.pop() + " ");
    }

/连个队列实现一个栈**
先把第一个元素放入q1,第二个元素入q2,在把第一个元素取出入q2,
* 此时第一个队列为空,第三元素入q1,再把q2中元素取出放q1,此时q2为空
* 将下一个元素放入q2,把q1中全部元素移除放入q2,如此反复
* 第二种方法,把所有元素放入q1,删除一个元素,其在队尾的位置,所以先把待删除元素以上的
* 元素移到q2去,在删除下元素时,再从q2中把待删除元素以上元素移到q1,如此反复。
* */

    static Queue q1 = new LinkedList();
    static Queue q2 = new LinkedList();
    static Queue queue(String str) {
        if(str!=null) {
            q1.add(str.charAt(0));
            q2.add(str.charAt(1));
            q2.add(q1.remove());
            int i = 2;
            while(i <= str.length()-1) {
                if(q1.isEmpty()&& !q2.isEmpty()) {
                    q1.add(str.charAt(i));
                    while(!q2.isEmpty()) {
                        q1.add(q2.remove());
                    }
                } else {
                    q2.add(str.charAt(i));
                    while(!q1.isEmpty()){
                        q2.add(q1.remove());
                    } 
                }
                i++;
            }
        }
        return q1.isEmpty() ? q2 : q1;
    }

    //测试
    public static void main(String[] args) {
        //add("abcdefg");
    //  deleteHead();
        Queue q = queue("12345");
        while(!q.isEmpty()){
            System.out.print(q.remove());
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值