当前位置: 首页 > 编程笔记 >

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

萧萧迟
2023-03-14
本文向大家介绍使用C语言来解决循环队列问题的方法,包括了使用C语言来解决循环队列问题的方法的使用技巧和注意事项,需要的朋友参考一下

题目描述:

    大家都知道数据结构里面有一个结构叫做循环队列。顾名思义,这是一个队列,并且是循环的。但是现在,淘气的囧哥给这个循环队列加上了一些规矩,其中有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"); 
    } 
  } 
 类似资料:
  • 本文向大家介绍C语言实现循环队列,包括了C语言实现循环队列的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了C语言实现循环队列的具体代码,供大家参考,具体内容如下 注意事项: 1、循环队列,是队列的顺序表示和实现。因为是尾进头出,所以和顺序栈不同的是需要将顺序队列臆造成一个环状的空间,以便在尾部添加满之后从头部空位开始插入。 2、也可以使用数组队列,也就是不能动态增长的顺序队列,这样不

  • 本文向大家介绍C语言基于循环链表解决约瑟夫环问题的方法示例,包括了C语言基于循环链表解决约瑟夫环问题的方法示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C语言基于循环链表解决约瑟夫环问题的方法。分享给大家供大家参考,具体如下: 概述: 约瑟夫环问题,是一个经典的循环链表问题,题意是:已知 n 个人(以编号1,2,3,…,n分别表示)围坐在一张圆桌周围,从编号为 k 的人开始顺时针报数

  • 本文向大家介绍详解数据结构C语言实现之循环队列,包括了详解数据结构C语言实现之循环队列的使用技巧和注意事项,需要的朋友参考一下 本文讲的是循环队列,首先我们必须明白下面几个问题 循环队列的基础知识 1.循环队列需要几个参数来确定 循环队列需要2个参数,front和rear 2.循环队列各个参数的含义 (1)队列初始化时,front和rear值都为零; (2)当队列不为空时,front指向队列的第一

  • 本文向大家介绍C语言实现的排列组合问题的通用算法、解决方法,包括了C语言实现的排列组合问题的通用算法、解决方法的使用技巧和注意事项,需要的朋友参考一下 尽管排列组合是生活中经常遇到的问题,可在程序设计时,不深入思考或者经验不足都让人无从下手。由于排列组合问题总是先取组合再排列,并且单纯的排列问题相对简单,所以本文仅对组合问题的实现进行详细讨论。以在n个数中选取m(0<m<=n)个数为例,问题可分解

  • 本文向大家介绍C语言实现最长递增子序列问题的解决方法,包括了C语言实现最长递增子序列问题的解决方法的使用技巧和注意事项,需要的朋友参考一下 本文实例展示了C语言实现最长递增子序列问题的解决方法。分享给大家供大家参考。具体方法如下: 问题描述: 给定一个序列,找出其最长递增子序列长度。 比如 输入 1 3 7 5 输出 3 算法解决思路: 利用动态规划的思想,以序列的每个点最为最右端,找出每个点作为

  • 主要内容:C语言for循环中的三个表达式除了 while循环,C语言中还有 for 循环,它的使用更加灵活,完全可以取代 while 循环。 上节我们使用 while 循环来计算1加到100的值,代码如下: 可以看到,语句①②③被放到了不同的地方,代码结构较为松散。为了让程序更加紧凑,可以使用 for 循环来代替,如下所示: 在 for 循环中,语句①②③被集中到了一起,代码结构一目了然。 for 循环的一般形式为: for(表达式1;