队列和栈

队列: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("
桌面上没有更多牌");
            }
            
        }

 

原文地址:https://www.cnblogs.com/huen/p/4067326.html