• 队列和栈


    队列:1种头部出列,尾部入队的数据结构,当头尾下标相等时队列为空。

    队列是广度优先搜索的核心数据结构。 

    =============================

    1.第一个数删除,下一个数放到最后,直到没有数可以再删除,顺序打印删除的数。

        //对6,3,1,7,5,8,9,2,4数进行出队入队操作,第一个数出队,下一个数加入到队尾
        int q[102]={6,3,1,7,5,8,9,2,4},head,tail;
        head=0;
        tail=9;//指向nil
        while (head<tail) {
            //打印并出队
            printf("%d	",q[head]);
            head++;
            //将新的队首添加倒队尾
            q[tail]=q[head];
            tail++;
            //再将队首出队
            head++;
        }

    使用结构体情况下的实现

    struct queue {
        int data[100];
        int head;
        int tail;
    };
    
    int main(int argc, const char * argv[])
    {
    
        //初始化队列
        struct queue q;
        q.head=0;
        q.tail=0;
        for (int i = 0; i <9; i++) {
            scanf("%d",&q.data[q.tail]);
            q.tail++;
        }
    
        while (q.head<q.tail) {
            printf("%d	",q.data[q.head]);
            q.head++;
            
            q.data[q.tail] = q.data[q.head];
            q.tail++;
            
            q.head++;
        }
        
        return 0;
    }

     2栈结构: 通过栈结构保存中间下标前的值,用于判断是否回文数

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

    .

    //通过栈结构判段回文字符
            char a[101],s[101];
            int len,mid,next,top;
            gets(a);
            len = strlen(a);
            printf("len = %d
    ",len);
            mid = len/2 -1;
            printf("mid = %d
    ",mid);
            
            if(len%2==0)
                next = mid+1;
            else
                next = mid+2;
            
            //将mid前的字符依次入栈
            top = 0;
            s[top] = 't';
            for (int i = 0; i <= mid; i++)
            {
                printf("num1 = %d	",a[i]);
                s[++top] = a[i];
            }
            printf("count = %lu
    ",strlen(s));
            printf("top = %d
    ",top);
            //开始匹配
            for (int i = next; i < len; i++)
            {
                printf("f1 = %d
     f2= %d
    ",a[i],s[top]);
                if (a[i] != s[top])
                {
                    break;
                }
                top--;
            }
            
            if (top==0) {
                printf("Yes");
            }else{
                printf("No");
            }

    4.队列与栈的应用

    小猫钓鱼游戏。该游戏主要有2种操作,分别是出牌和赢牌。这恰好对应队列的两个操作,出牌就是出队,赢牌就是入队。小哈的操作与小哼的一样。而桌子就是一个栈,每打出一张牌就放到桌上就相当于入栈。当有人赢牌的时候,依次将牌从桌子上拿走就相当于出栈。赢牌规则是:如果某人打出的牌与桌上的某张牌相同,即可将2张牌以及中间所夹有的牌全部拿走。

    //小猫钓鱼游戏。该游戏主要有2种操作,分别是出牌和赢牌。这恰好对应队列的两个操作,出牌就是出队,赢牌就是入队。小哈的操作与小哼的一样。而桌子就是一个栈,每打出一张牌就放到桌上就相当于入栈。当有人赢牌的时候,依次将牌从桌子上拿走就相当于出栈。赢牌规则是:如果某人打出的牌与桌上的某张牌相同,即可将2张牌以及中间所夹有的牌全部拿走。
            //初始化队列和栈
            int t;
            int xiaoHeng[] = {2,4,1,2,5,6};
            int xiaoHa[] = {3,1,3,5,6,4};
            struct stack s;
            s.top = 0;
            struct queue q1,q2;
            q1.head = 1;
            q1.tail = 1;
            q2.head = 1;
            q2.tail = 1;
            for (int i = 1; i <= 6; i++)
            {
                q1.data[q1.tail] = xiaoHeng[i-1];
                q1.tail++;
            }
            
            for (int i = 1; i <= 6; i++)
            {
                q2.data[q2.tail] = xiaoHa[i-1];
                q2.tail++;
            }
            //初始化标记,用于牌是否打出某张牌
            int book[10];
            for (int i = 0; i < 10; i++) {
                book[i] = 0;
            }
            //当队列为空的时候不执行循环
            while (q1.head < q1.tail && q2.head < q2.tail)
            {
                t = q1.data[q1.head];
                //桌面上没有该张牌时
                if (book[t] == 0)
                {
                    //出牌
                    q1.head++;
                    s.top++;
                    s.data[s.top] = t;
                    book[t] = 1;
                }
                else
                {
                    //赢牌
                    q1.head++;
                    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];
                if (book[t] == 0)
                {
                    q2.head++;
                    s.top++;
                    s.data[s.top] = t;
                    book[t] = 1;
                }
                else
                {
                    q2.head++;
                    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 (q2.head==q2.tail)
            {
                printf("小哼赢牌
    手上的牌是:");
                for (int i = q1.head; i < q1.tail-1; i++)
                {
                    printf("%d ",q1.data[i]);
                }
                //如果桌面上还有牌则输出
                if (s.top>0)
                {
                    printf("
    桌面的牌是:");
                    for (int i = s.top; i > 0; i--) {
                        printf("%d ",s.data[i]);
                    }
                }
                else
                {
                    printf("
    桌面上没有更多牌");
                }
            }
            else
            {
                printf("小哈赢牌
    手上的牌是:");
                for (int i = q2.head; i < q2.tail-1; i++)
                {
                    printf("%d ",q2.data[i]);
                }
                
                if (s.top > 0)
                {
                    printf("
    桌面的牌是:");
                    for (int i = s.top; i > 0; i--)
                    {
                        printf("%d ",s.data[s.top]);
                    }
                }
                else
                {
                    printf("
    桌面上没有更多牌");
                }
                
            }

     

  • 相关阅读:
    安装go语言开发环境
    【Graph】399. Evaluate Division(Medium)
    【Divide and Conquer】53.Maximum Subarray(easy)
    int数组交并差集
    Git强制覆盖本地文件
    Git手动合并
    [转]关于BETA、RC、ALPHA、Release、GA等版本号的意义
    [置顶] java处理office文档与pdf文件(二)
    [置顶] 左联接数据不统一问题
    将博客搬至CSDN
  • 原文地址:https://www.cnblogs.com/huen/p/4067326.html
Copyright © 2020-2023  润新知