• 基础-栈队列简单测试


    package com.nxz.blog.otherTest;
    
    import java.util.Queue;
    import java.util.Stack;
    import java.util.concurrent.LinkedBlockingQueue;
    
    public class Test02 {
    
        /**
         * 扑克游戏——“小猫钓鱼”。游戏的规则是这样的:将一副扑克牌平均分成两份,每人拿一份。小哼先拿出手中的
         * 第一张扑克牌放在桌上,然后小哈也拿出手中的第一张扑克牌,并放在小哼刚打出的扑克牌
         * 的上面,就像这样两人交替出牌。出牌时,如果某人打出的牌与桌上某张牌的牌面相同,即
         * 可将两张相同的牌及其中间所夹的牌全部取走,并依次放到自己手中牌的末尾。当任意一人
         * 手中的牌全部出完时,游戏结束,对手获胜
         */
        private static Queue<Integer> q1 = new LinkedBlockingQueue<Integer>();
        private static Queue<Integer> q2 = new LinkedBlockingQueue<Integer>();
        private static Stack<Integer> stack = new Stack<>();
    
        /**
         * 以上规则要求可以使用两个队列来表示每个人手中的牌,一个栈表示桌面上的牌,一个数组来判断时候存在相同的牌
         *
         * @param args
         */
        public static void main(String[] args) {
            //初始化两个队列,也就是每个人手中的牌
            int[] arr1 = new int[]{2, 4, 1, 2, 5, 6};
            int[] arr2 = new int[]{3, 1, 3, 5, 6, 4};
            for (int i : arr1) {
                q1.add(i);
            }
            for (int i : arr2) {
                q2.add(i);
            }
    
            //初始化判断桌面上有牌的数组,大小为10,因为本次测试中不同牌的个数为最多为9个
            int[] book = new int[10];
    
            //当向桌上扔牌时,就表示向stack中入栈,同时在数组中索引为牌的值的位置加1,表示桌面上已经有这个牌了
            //循环扔牌
            while (!q1.isEmpty() && !q2.isEmpty()) {
                //定义一个临时变量,表示当前扔的牌
                int temp;
                //stack弹出的
                int t;
                temp = q1.poll();
    
                if (book[temp] == 0) {
                    stack.push(temp);
                    book[temp] = 1;
                } else {
                    //表示桌面上已经存在
                    book[temp] = 0;
                    q1.add(temp);
                    while (!stack.isEmpty() && (t = stack.pop()) > 0) {
                        book[t] = 0;
                        q1.add(t);
                        if (t == temp) {
                            break;
                        }
                    }
                }
                if(q1.isEmpty()){
                    break;
                }
    
    
                temp = q2.poll();
    
                if (book[temp] == 0) {
                    stack.push(temp);
                    book[temp] = 1;
                } else {
                    //表示桌面上已经存在
                    q2.add(temp);
                    book[temp] = 0;
                    while (!stack.isEmpty() && (t = stack.pop()) > 0) {
                        book[t] = 0;
                        q2.add(t);
                        if (t == temp) {
                            break;
                        }
                    }
                }
                if(q2.isEmpty()){
                    break;
                }
    
                System.out.println();
                System.out.print("stack:");
                stack.stream().forEach(item -> {
                    System.out.print(item);
                });
            }
    
            //判断输赢
            if(q1.isEmpty()){
                System.out.println("第二个人获胜");
                Object[] objects = q2.toArray();
                for (Object object : objects) {
                    System.out.print(object);
                }
            }
            if(q2.isEmpty()){
                System.out.println("第一个胜利");
                Object[] objects = q1.toArray();
                for (Object object : objects) {
                    System.out.print(object);
                }
            }
    
            System.out.println();
            stack.stream().forEach(item -> {
                System.out.print(item);
            });
    
    
        }
    
    }
    第二个人获胜
    1652341
    34562
    Process finished with exit code 0
  • 相关阅读:
    SourceTree
    记录:解决标签在选中状态下,鼠标进入(hover)后变色的问题
    在angular中超过字数后以...展示
    小程序下拉刷新步骤——完成
    eclipse配置文件乱码
    jQuery的deferred对象
    营销策划书(2007)
    前端IT攻城狮--网址搜藏(-- 欢迎留言补充 --)
    prop和attr的区别
    HTML速写
  • 原文地址:https://www.cnblogs.com/nxzblogs/p/11143648.html
Copyright © 2020-2023  润新知