《啊哈!算法》第二章代码实现

锵锵!我又回来了~现在来做第二章吧!
小二,上代码? 2.1 队列-破解密码

static class list{
        int[] num=new int[100];
        int start;
        int end;
    }
    public static void main(String[] args){
        list l=new list();
        /*l.num=new int[100]; 提前赋值
        l.num[0]=6;
        l.num[1]=3;
        l.num[2]=1;
        l.num[3]=7;
        l.num[4]=5;
        l.num[5]=8;
        l.num[6]=9;
        l.num[7]=2;
        l.num[8]=4;*/
        //6 3 1 7 5 8 9 2 4
        Scanner sc=new Scanner(System.in);//键盘输入
        for(int i=0;i<9;i++)
            l.num[i]=sc.nextInt();
        l.start=0;
        l.end=9;
        while(l.start<l.end){
            System.out.println(l.num[l.start]);
            l.start++;
            l.num[l.end]=l.num[l.start];
            l.end++;
            l.start++;
        }
    }

第二个代码,因为书上已经有栈的字符匹配代码了,不如做一做作者让我们尝试的括号匹配,三种类型的括号:{},组合成一个字符串,问能否完全匹配。
2.2 括号匹配

public boolean BracketMatching(){
        Scanner sc=new Scanner(System.in);
        int N=sc.nextInt();
        String s=sc.next();
        char[] n=new char[N];
        for(int i=0;i<N;i++)
            n[i]=s.charAt(i);
        Stack<Character> stack=new Stack<Character>();
        for(int i=0;i<N;i++){
            if(n[i]=='('||n[i]=='{'||n[i]=='[')
                stack.push(n[i]);
            if(n[i]==')'){   //三种括号,三种情况
                if(stack.peek()!='(')
                    return false;
                stack.pop();
            }
            if(n[i]=='}'){
                if(stack.peek()!='{')
                    return false;
                stack.pop();
            }
            if(n[i]==']'){
                if(stack.peek()!='[')
                    return false;
                stack.pop();
            }
            }
        if(stack.size()==0) return true;
        else return false;
        }

到这里为止还算顺利,那么就继续前进吧~
2.3 小猫钓鱼游戏
太难过了,太难过了,我愿用我10年欧气换我的Java程序不出异常orz(你有欧气嘛喂!)太难过啦!!为什么同样的程序步骤C不会报异常Java就在那边报报报报报报报——疯掉了!
在这里插入图片描述

class list{
        int[] card=new int[100];
        int start;
        int end;
    }
    class stack{
        int[] data=new int[100];
        int top;
    }
    public void turn(int t,list l,stack s,int[] flag){

        if(flag[l.card[l.start]]==0)//赢不了牌
        {
            s.top++;
            s.data[s.top]=t;
            l.start++;
            flag[t]=1;
        }
        else{//赢牌啦
            l.card[l.end++]=t;
            l.start++;
            while(t!=s.data[s.top]){
                flag[s.data[s.top]]=0;
                l.card[l.end++]=s.data[s.top];
                s.top--;
            }
        }
    }
    public void printCards(list l,stack s){
        int i=l.start;
        while(i<l.end){
            System.out.println(l.card[i]);//输出玩家的牌
            i++;
        }
        int k=1;
        while(k<=s.top){
            System.out.println(s.data[k]);
            k++;//输出桌面上的牌
        }
    }
    public void Catfishing(){
        list l1=new list();
        list l2=new list();
        stack s=new stack();
        l1.start=0;
        l1.end=0;
        l2.start=0;
        l2.end=0;
        s.top=0;
        //发牌
        Scanner sc=new Scanner(System.in);
        int N=sc.nextInt();//首先,一人多少张牌
        for(int i=0;i<N;i++){
            l1.card[l1.end++]=sc.nextInt();
        }
        for(int i=0;i<N;i++){
            l2.card[l2.end++]=sc.nextInt();
        }
        int[] flag=new int[10];
        for(int i=0;i<=9;i++)
            flag[i]=0;//没有数值为i的牌

        //开始出牌
        while(l1.start<l1.end&&l2.start<l2.end){
            int t=l1.card[l1.start];
            turn(t,l1,s,flag);//小哼先出牌
            int m=l2.card[l2.start];
            turn(m,l2,s,flag);//小哈出牌
        }
        if(l1.start==l1.end)//哎呀,小哼输了
        {
            System.out.println("小哈赢了");
            printCards(l2, s);
        }
        if(l2.start==l2.end)//小哈输了
        {
            System.out.println("小哼赢了");
            printCards(l1, s);
        }

        }
        public static void main(String[] args){
        algorithm test=new algorithm();
        test.Catfishing();
        }

终于搞定了,差不多要跪在这道题上面了!
本来预计第二章一次性完结的,剩下的晚上补吧~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值