首页 > 编程 > C > 正文

使用C语言来解决循环队列问题的方法

2020-01-26 14:58:14
字体:
来源:转载
供稿:网友

题目描述:

    大家都知道数据结构里面有一个结构叫做循环队列。顾名思义,这是一个队列,并且是循环的。但是现在,淘气的哥给这个循环队列加上了一些规矩,其中有5条指令:

    (1) Push K, 让元素K进队列。

    (2) Pop,对头元素出队列。

    (3) Query K,查找队列中第K个元素,注意K的合法性。

    (4) Isempty,判断队列是否为空。

    (5) Isfull,判断队列是否已满。

    现在有N行指令,并且告诉你队列大小是M。

输入:

    第一行包含两个整数N和M。1<=N,M<=100000。

    接下来有N行,表示指令,指令格式见题目描述。

    其中元素均在int范围。

输出:

    对于指令(1),若队列已满,输出failed,否则不做输出。

    对于指令(2),若队列已空,输出failed,否则不做输出。

    对于指令(3),输出队列中第K个元素,若不存在,输出failed。

    对于指令(4)和(5),则用yes或者no回答。

    详情见样例。

样例输入:

    12 2Push 1Push 2Push 3Query 2Query 3IsemptyIsfullPopPopPopIsemptyIsfull

样例输出:

    failed2failednoyesfailedyesno

AC代码:

   

#include <stdio.h>   #include <stdlib.h>   #include <string.h>      #define queuesize 100001  //最大队列长度      struct queue   {     int front;     int rear;     int data[queuesize];     int count; //记录队列中的元素   };      void InitQueue(struct queue *Q);   void EnQueue(struct queue *Q, int element, int m);   void Dequeue(struct queue *Q, int m);   void QueueSearch(struct queue *Q, int k, int m);      int main()   {     int n, m, i, element, k, flag;     char command[10];        while(scanf("%d%d",&n, &m) != EOF)     {       if(n < 1 || m > 100000)         return 0;       struct queue *Q;       Q = malloc(sizeof(struct queue));       InitQueue(Q);       for(i = 0; i < n; i ++)       {         scanf("%s",command);         if (strcmp(command,"Push") == 0)         {           scanf("%d",&element);           EnQueue(Q, element, m);         }else if (strcmp(command,"Pop") == 0)         {           Dequeue(Q, m);         }else if (strcmp(command,"Query") == 0)         {           scanf("%d",&k);           QueueSearch(Q, k, m);         }else if (strcmp(command,"Isempty") == 0)         {           flag = (Q -> count == 0)? 1 : 0;           if(flag)           {             printf("yes/n");           }else           {             printf("no/n");           }         }else if (strcmp(command,"Isfull") == 0)         {           flag = (Q -> count == m)? 1 : 0;           if(flag)           {             printf("yes/n");           }else           {             printf("no/n");           }         }       }     }       return 0;   }      /**    * Description:队列初始化    */   void InitQueue(struct queue *Q)   {     Q -> front = Q -> rear = 0;     Q -> count = 0;   }      /**    * Description:入队操作    */   void EnQueue(struct queue *Q, int element, int m)   {     int flag;     flag = (Q -> count == m)? 1 : 0;         if(!flag)     {       Q -> data[Q -> rear] = element;       Q -> count ++;       Q -> rear = (Q -> rear + 1) % m;     }else     {       printf("failed/n");     }   }      /**    * Description:出队操作    */   void Dequeue(struct queue *Q, int m)   {     int flag;     int element;        flag = (Q -> count == 0)? 1 : 0;        if(!flag)     {       element = Q -> data[Q -> front];       Q -> front = (Q -> front + 1) % m;       Q -> count --;     }else     {       printf("failed/n");     }   }      /**    * Description:查找队列中的指定元素    */   void QueueSearch(struct queue *Q, int k, int m)   {     int flag, temp;     flag = (Q -> count == 0)? 1: 0;     temp = Q -> front + k - 1;     if((!flag) && (k <= m && k >= 1))     {       if((Q -> front < Q -> rear) && ( Q-> front <= temp && Q -> rear > temp))         printf("%d/n",Q -> data[temp]);       else if((Q -> front > Q -> rear) && (temp >= Q -> front || temp < Q->rear))         printf("%d/n",Q -> data[temp]);       else if(Q -> front == Q -> rear)         printf("%d/n",Q -> data[temp]);       else         printf("failed/n");     }else     {       printf("failed/n");     }   } 

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选