啊哈,算法自学记——3rd

队列:(先进先出FIFO)

	小哈给了小哼一串加密过的数字,同时小哈也告诉了小哼解密规则。
	规则是这样的:首先将第 1 个数删除,紧接着将第 2 个数放到这串数的尾,
	再将第 3 个数删除并将第 4 个数放到这串数的末尾,再将第 5 个数删除……
	直到剩下最后一个数,将最后一个数也删除。按照刚才删除的顺序,把这些删除的数连在一起就是小哈的 QQ 啦

我自己题都没看懂,简单来说就是,从头部取两位,把第一位删除,把第二位续到剩下的数的后面,然后!!!删除的数才是结果。。。

在这里插入图片描述

#include <stdio.h>

typedef struct queen
{
    int data[101];
    int head;
    int tail;
};

int main(int argc, char const *argv[])
{
    struct queen q;
    q.head=0;
    q.tail=0;

    printf("Input 9 num:\r\n");
    for (int i = 0; i < 9; i++)//录入9个数
    {
        scanf("%d",&q.data[q.tail]);
        q.tail++;
    }

    while (q.head<q.tail)//当队列不为空
    {
        //打印队首
        printf("%d",q.data[q.head]);//删除的才是需要的
        q.head++;//这里删除第一位,这里已经是指向第二位了,只是为了把第二位放到tail+1位

        //将新的队首的数放置队尾+1
        q.data[q.tail]=q.data[q.head];//续数
        q.tail++;//尾部下标+1,往后延
        //再将队首出队
        q.head++;//第二位已经用过了,这里把第二位删除
    }

    return 0;
}

栈(先进后出)

验证字符串是否是回文(例如:aha,123321)

#include <stdio.h>
#include <string.h>


int main(int argc, char const *argv[])
{
    char a[101],s[101];

    int next,len,mid,top;

    printf("Input a string:\r\n");
    gets(a);//读取一个字符串
    len =strlen(a);//读取字符串长度

    mid=len/2-1;//字符串中点

    top=0;//栈初始化

    //将mid前面的字符串入栈
    for (int i = 0; i <= mid; i++)
    {
        s[++top]=a[i];
    }

    if (len%2==0)//判断回文是偶数个字符还是奇数个字符
    {
        next=mid+1;
    }
    else
    {
        next=mid+2;
    }

    //开始匹配
    for (int i = next; i < len; i++)
    {
        if (a[i]!=s[top])//a[i]是字符串从中点开始以后的字符,s[top]是栈自顶之下的字符
        {
            break;
        }
        top--;
    }

    if (top==0)//如果能一一匹配则是回文
    {
        printf("YES\r\n");
    }
    else
    {
        printf("NO\r\n");
    }

    return 0;
}

纸牌游戏——小猫钓鱼(俗称:接竹竿

游戏的规则是这样的:将一副扑克牌平均分成两份,每人拿一份。小哼先拿出手中的第一张扑克牌放在桌上,然后小哈也拿出手中的第一张扑克牌,并放在小哼刚打出的扑克牌的上面,就像这样两人交替出牌。出牌时,如果某人打出的牌与桌上某张牌的牌面相同,可将两张相同的牌及其中间所夹的牌全部取走,并依次放到自己手中牌的末尾。当任意一人手中的牌全部出完时,游戏结束,对手获胜。(这不就是接竹竿嘛,())
假如游戏开始时,小哼手中有 6 张牌,顺序为 2 4 1 2 5 6,小哈手中也有 6 张牌,顺序为 3 1 3 5 6 4,最终谁会获胜呢?

#include <stdio.h>
#include <string.h>
//定义一个结构体
typedef struct queen
{
    int data[101];
    int head;
    int tail;
};

typedef struct stack
{
    int data[10];
    int top;
};

int main(int argc, char const *argv[])
{
    //定义两个结构体,代表两人手中的牌
    struct queen q1,q2;
    struct stack  s;//定义一个栈,代表放在桌面的牌
    int book[10];//用来比较是否能收牌
    int i,t;

    q1.head=0;
    q1.tail=0;

    q2.head=0;
    q2.tail=0;

    s.top=0;//栈初始化

    for (int i = 0; i < 9; i++)//标记那些牌已经放在桌子上
    {
        book[i]=0;
    }
    

    //首先加载两人手中的牌
    printf("Input six num for q1:\r\n");
    for (int i = 0; i < 6; i++)//每人只有六张牌
    {
        scanf("%d",&q1.data[q1.tail]);
        q1.tail++;
    }

    printf("Input six num for q2:\r\n");
    for (int  i = 0; i < 6; i++)
    {
        scanf("%d",&q2.data[q2.tail]);
        q2.tail++;
    }
    
    while (q1.head<q1.tail && q2.head<q2.tail)//当两个人手中都有牌的时候
    {
        t=q1.data[q1.head];//q1先出牌了
        //判断是否能收牌
        if (book[t]==0)//不能赢牌;类似于桶排序中的检测方法,如果=0那肯定是没有出现过t
        {
            q1.head++;//把q1打出的牌出队,删掉
            s.top++;
            s.data[s.top]=t;//把打出的牌入栈,也就是放到桌面上
            book[t]=1;//标记桌面上有t这张牌
        }
        else//可以收牌
        {
            q1.head++;//把q1打出的牌出队,删掉
            q1.data[q1.tail]=t;//把打出的牌放到自己手牌的尾部
            q1.tail++;
            //再依次收起再桌面上赢的牌
            while (s.data[s.top]!=t)//直到和打出的牌一样时
            {
                book[s.data[s.top]]=0;//取消桌面上已经收走的牌的标记
                q1.data[q1.tail]=s.data[s.top];//依次放入手牌的尾部
                q1.tail++;
                s.top--;
            }
            
        }
        
        t=q2.data[q2.head];//q2出牌了
        //判断是否能收牌
        if (book[t]==0)//不能赢牌;类似于桶排序中的检测方法,如果=0那肯定是没有出现过t
        {
            q2.head++;//把q2打出的牌出队,删掉
            s.top++;
            s.data[s.top]=t;//把打出的牌入栈,也就是放到桌面上
            book[t]=1;//标记桌面上有t这张牌
        }
        else//可以收牌
        {
            q2.head++;//把q2打出的牌出队,删掉
            q2.data[q2.tail]=t;//把打出的牌放到自己手牌的尾部
            q2.tail++;
            //再依次收起再桌面上赢的牌
            while (s.data[s.top]!=t)//直到和打出的牌一样时
            {
                book[s.data[s.top]]=0;//取消桌面上已经收走的牌的标记
                q2.data[q2.tail]=s.data[s.top];//依次放入手牌的尾部
                q2.tail++;
                s.top--;
            }   
        }
    }
    

    if (q1.head==q1.tail)//q1木牌了,输了
    {
        printf("Q2  Win \r\n");
        printf("Q2 have :\r\n");

        for (int i = q2.head; i < q2.tail; i++)
        {
            printf("--%d",q2.data[i]);
        }

        if (s.top>0)//桌上还有牌
        {
            printf("\nDesktop have:\n");
            for (int i = 1; i <= s.top; i++)
            {
                printf("  %d",s.data[i]);
            }
            
        }
        else
        {
            printf("No puke\rn");
        }
    }
    else if(q2.head==q2.tail)
    {
        printf("Q1  Win \r\n");
        printf("Q1 have :\r\n");

        for (int i = q1.head; i < q1.tail; i++)
        {
            printf("--%d",q1.data[i]);
        }

        if (s.top>0)//桌上还有牌
        {
            printf("\nDesktop have:\n");
            for (int i = 1; i <= s.top; i++)
            {
                printf("  %d",s.data[i]);
            }
            
        }
        else
        {
            printf("No puke\rn");
        }
    }
    
    

    return 0;
}

在这里插入图片描述

posted @ 2020-03-22 23:08  火红色祥云  阅读(145)  评论(0编辑  收藏  举报