基础-栈队列简单测试

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
原文地址:https://www.cnblogs.com/nxzblogs/p/11143648.html