肥宅洛夫特斯基 2021-06-13 10:35 采纳率: 100%
浏览 1770
已采纳

7-6 有趣的队列 (14 分)

本题重新定义队列出队的操作:队首出队的数字重新在队尾入队。

例:队列中有1 2 3三个数字,现要求队首出队,则1从队首出队,同时1从队尾入队,队列变成2 3 1

入队的顺序为1,2,3,4......n,同时给一个二进制字符串,1代表出队操作,0代表入队操作。

输入格式:

在第一行有两个数字n,m(n<=100,n<m),其中n为入队的数字个数,m代表操作数

接下来m行,每行一个数字,1或者0,代表不同的操作

输出格式:

输出操作后队列的每个数字,数字间以空格分隔,最后一个数字后没有空格

输入样例:

5 8
0
0
1
0
1
0
1
0

输出样例:

3 2 4 1 5
  • 写回答

3条回答 默认 最新

  • 关注
    #include<stdbool.h>
    #include<stdio.h>
    #include<assert.h>
    #include<malloc.h>
    typedef int Data;
    typedef struct _Node
    {
    	Data data;
    	struct _Node* next;
    }Node;
    typedef struct _LinkQueue
    {
    	int size;
    	Node* front;
    	Node* tail;
    }LinkQueue;
    //创建队列
    LinkQueue* createLinkQueue();
    //入队
    void push(LinkQueue* que, Data val);
    //出队
    void pop(LinkQueue* que);
    //获取队头元素
    Data front(LinkQueue* que);
    //判空
    bool empty(LinkQueue* que);
    
    LinkQueue* createLinkQueue()
    {
        LinkQueue* que = calloc(1, sizeof(LinkQueue));
        assert(que != NULL);
        que->front = calloc(1, sizeof(Node));
        assert(que->front != NULL);
        que->tail = que->front;
        que->size = 0;
        return que;
    }
    static Node* createNode(Data val)
    {
        Node* newNode = calloc(1, sizeof(Node));
        if (newNode == NULL)
        {
            return NULL;
        }
        newNode->data = val;
        return newNode;
    }
    void push(LinkQueue* que, Data val)
    {
        Node* newNode = createNode(val);
        if (newNode == NULL)
        {
            printf("Nueerrier");
        }
        que->tail->next = newNode;
        que->tail = newNode;
        que->size++;
    }
    void pop(LinkQueue* que)
    {
        if (empty(que))
        {
            return;
    
        }
        Node* delNode = que->front->next;
        que->front->next = delNode->next;
        free(delNode);
        que->size--;
    
    }
    
    Data front(LinkQueue* que)
    {
        assert(!empty(que));
        return que->front->next->data;
    }
    
    bool empty(LinkQueue* que)
    {
        return que->size == 0;
    }
    int main()
    {
        int n, m, ch, re=1;
        LinkQueue* que = createLinkQueue();
        scanf("%d%d", &n,&m);
    
        for (int i = 0; i < m; i++)
        {
            scanf("%d", &ch);
            switch (ch)
            {
            case 0:
            {
                push(que, re++);
                break;
            }
            case 1:
            {      
                push(que, front(que));
                pop(que);
                break;
            }
    
            }
    
        }
        int s=1;
        while (!empty(que))
        {
            printf("%d", front(que));
            if(s<n)
            {
                printf(" ");
                s++;
            }
         
            pop(que);
        }
        printf("\n");
        return 0;
    }
    

     

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?