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

 更新时间:2015年08月17日 16:47:38   作者:低调小一  
这篇文章主要介绍了使用C语言来解决循环队列问题的方法,来自ACM的练习题实例,需要的朋友可以参考下

题目描述:

    大家都知道数据结构里面有一个结构叫做循环队列。顾名思义,这是一个队列,并且是循环的。但是现在,淘气的囧哥给这个循环队列加上了一些规矩,其中有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++中的各种容器的使用方法,本文结合示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-01-01
  • C++中this指针的用法及介绍

    C++中this指针的用法及介绍

    以下是对C++中this指针的用法进行了详细的分析介绍,需要的朋友可以过来参考下
    2013-08-08
  • C语言实现数据的压缩与解压

    C语言实现数据的压缩与解压

    数据压缩是通过一系列的算法和技术将原始数据转换为更紧凑的表示形式,以减少数据占用的存储空间,数据解压缩则是将压缩后的数据恢复到原始的表示形式,本文给大家详细介绍了C语言实现数据压缩与解压,需要的朋友可以参考下
    2023-08-08
  • C语言实现简易通讯录实例

    C语言实现简易通讯录实例

    大家好,本篇文章主要讲的是C语言实现简易通讯录实例,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02
  • C语言高效实现向量循环移位

    C语言高效实现向量循环移位

    这篇文章主要为大家详细介绍了C语言高效实现向量循环移位,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-03-03
  • C/C++中命名空间(namespace)详解及其作用介绍

    C/C++中命名空间(namespace)详解及其作用介绍

    今天小编就为大家分享一篇关于C++命名空间namespace的介绍与使用,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2021-09-09
  • C++类中的常量介绍

    C++类中的常量介绍

    const数据成员只在某个对象生存期内是常量,而对于整个类而言却是可变的,因为类可以创建多个对象,不同的对象其const数据成员的值可以不同
    2013-10-10
  • C语言之格式化屏幕输出详解

    C语言之格式化屏幕输出详解

    这篇文章主要介绍了C语言之格式化屏幕输出的相关资料,需要的朋友可以参考下,小编觉得这篇文章写的还不错,希望能够给你带来帮助
    2021-11-11
  • 使用C语言构建基本的二叉树数据结构

    使用C语言构建基本的二叉树数据结构

    这篇文章主要介绍了使用C语言使用C语言构建基本的二叉树数据结构,包括根据前序序列和中序序列构建二叉树的方法,需要的朋友可以参考下
    2015-08-08
  • C++实现LeetCode(148.链表排序)

    C++实现LeetCode(148.链表排序)

    这篇文章主要介绍了C++实现LeetCode(148.链表排序),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07

最新评论