使用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语言循环队列、c语言循环队列的实现、循环队列c语言实现、c语言队列实现,以便于您获取更多的相关知识。

时间: 2025-01-08 11:13:53

使用C语言来解决循环队列问题的方法_C 语言的相关文章

C语言简单实现计算字符个数的方法_C 语言

本文实例讲述了C语言简单实现计算字符个数的方法.分享给大家供大家参考.具体如下: char_counting.c如下: #include<stdio.h> int main() { long nc; nc = 0; while(getchar() != '0') { ++nc; } printf("%ld\n", nc); } 编译和使用下: 复制代码 代码如下: gcc char_counting.c -o char_counting.o   一种通常的调用方式: 复制代

C语言实现计算树的深度的方法_C 语言

本文实例讲述了C语言实现计算树的深度的方法.是算法设计中常用的技巧.分享给大家供大家参考.具体方法如下: /* * Copyright (c) 2011 alexingcool. All Rights Reserved. */ #include <iostream> using namespace std; struct Node { Node(int i = 0, Node *l = NULL, Node *r = NULL) : data(i), left(l), right(r) {}

C语言实现奇数阶魔方阵的方法_C 语言

本文实例讲述了C语言实现奇数阶魔方阵的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: #include "stdio.h" #include "string.h" #include "stdlib.h" #define N 5 void main(){ int a[N][N]={0}; int i,j; int k; i = 0; j = N/2; a[0][j]=1; for(k = 2; k <= N*N; k++

利用C语言替换文件中某一行的方法_C 语言

文件中存贮的内容如下所示: 11 1122 0 1122 * * 0 0 22 222 0 222 * * 0 0 33 333 0 333 * * 0 0 通过使用下面的几个函数,fopen,fprintf,fscanf,fseek,ftell . 具体的函数函数原型如下所示: FILE*fopen(const char*filename,const char *mode); int fprintf(FILE*stream,const char *format,...) int fscanf(

c语言中字符串分割函数及实现方法_C 语言

1.问题引入 自己在写一个linux下的模拟执行指令的时候,遇到了输入"cat a.c",要将该字符串分解成cat和a.c两个单独的字符串,虽然知道有strtok的存在,但是想自己尝试写一下,于是就自己写了一个,不过总是遇到这样或那样的问题,虽然最后调通了,不过确浪费了不少时间:后来作业交上去以后又仔细阅读了strtok函数,发现原来linux下已经改成strsep,所有在这里就写一下自己所走的过程. 2.自己写的字符串分割函数:用于分割指令,比如cat a.c最后会被分割成cat和a

使用C语言解决字符串匹配问题的方法_C 语言

最常想到的方法是使用KMP字符串匹配算法: #include <stdio.h> #include <stdlib.h> #include <string.h> int get_nextval(char *pattern, int next[]) { //get the next value of the pattern int i = 0, j = -1; next[0] = -1; int patlen = strlen(pattern); while ( i &l

C语言切割多层字符串(strtok_r strtok使用方法)_C 语言

1. strtok介绍 众所周知,strtok可以根据用户所提供的分割符(同时分隔符也可以为复数比如",.")将一段字符串分割直到遇到"\0". 比如,分隔符="," 字符串="Fred,John,Ann" 通过strtok 就可以把3个字符串 "Fred"      "John"       "Ann"提取出来. 上面的C代码为 复制代码 代码如下: int in=

C语言新建临时文件和临时文件名的方法_C 语言

C语言mkstemp()函数:建立临时文件头文件: #include <stdlib.h> 定义函数: int mkstemp(char * template); 函数说明:mkstemp()用来建立唯一的临时文件. 参数template 所指的文件名称字符串中最后六个字符必须是XXXXXX. Mkstemp()会以可读写模式和0600 权限来打开该文件, 如果该文件不存在则会建立该文件. 打开该文件后其文件描述词会返回. 文件顺利打开后返回可读写的文件描述词. 若果文件打开失败则返回NULL

C语言中读取时间日期的基本方法_C 语言

C语言time()函数:获取当前时间(以秒数表示)头文件: #include <time.h> 定义函数: time_t time(time_t *t); 函数说明:此函数会返回从公元 1970 年1 月1 日的UTC 时间从0 时0 分0 秒算起到现在所经过的秒数.如果t 并非空指针的话,此函数也会将返回值存到t 指针所指的内存. 返回值:成功则返回秒数,失败则返回((time_t)-1)值,错误原因存于errno 中. 范例 #include <time.h> main(){