如何实现循环队列_C 语言

生活中有很多队列的影子,比如打饭排队,买火车票排队问题等,可以说与时间相关的问题,一般都会涉及到队列问题;从生活中,可以抽象出队列的概念,队列就是一个能够实现“先进先出”的存储结构。队列分为链式队列和静态队列;静态队列一般用数组来实现,但此时的队列必须是循环队列,否则会造成巨大的内存浪费;链式队列是用链表来实现队列的。

#ifndef SQQUEUE_H_INCLUDED
#define SQQUEUE_H_INCLUDED /* 防止重复包含 */ 

//////////////////////////////////////////
//包含头文件
#include <stdlib.h>
#include "ds.h" // OK, Status 等定义 

//数据元素的类型(缺省使用int型)
#ifndef ElemType
#define ElemType int
#define USE_DEFAULT_ELEMTYPE /* 使用缺省类型的标志 */
#endif //ElemType 

//////////////////////////////////////////
//循环队列的存储结构 

#define MAXQSIZE 500/* 循环队列的最大容量 */
typedef struct {
  /* TODO (#1#): 这里完成循环队列的类型定义 */
  ElemType *base;
  int front;
  int rear;
  //....................................
} SqQueue; 

//////////////////////////////////////////
//循环队列的基本操作 

//构造一个空队列Q
Status InitQueue(SqQueue &Q)
{
  /* TODO (#2#): 构造空队列 */
  Q.base=(ElemType*)malloc(MAXQSIZE *sizeof(ElemType));
  if(!Q.base)exit(OVERFLOW);
  QQ.front=Q.rear =0;
  return OK; //TODO: 替换这行代码,以下同
  //....................................
} 

//销毁队列Q
// 前提:队列Q已存在
Status DestroyQueue(SqQueue &Q)
{
  /* TODO (#3#): 销毁队列 */
  free(Q.base);
  Q.base=NULL;
  Q.front=0;
  Q.rear=0;
  return OK;
  //....................................
} 

//将队列Q清为空队列
// 前提:队列Q已存在
Status ClearQueue(SqQueue &Q)
{
  /* TODO (#4#): 清空队列 */
  Q.base=0;
  Q.rear=0;
  return OK;
  //....................................
} 

//若队列Q为空,则返回TRUE,否则FALSE
// 前提:队列Q已存在
Status QueueEmpty(SqQueue Q)
{
  /* TODO (#5#): 判断队列是否为空 */
  if(Q.front==Q.rear)
    return OK;
  else
    return ERROR;
  //....................................
} 

//返回队列Q的元素个数,即队列长度
// 前提:队列Q已存在
int QueueLength(SqQueue Q)
{
  /* TODO (#6#): 返回队列长度 */
  return (Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;
  //....................................
} 

//取队列Q头元素用e返回
// 前提:队列Q存在且非空
Status GetHead(SqQueue Q,ElemType &e)
{
  /* TODO (#7#): 取队头元素存入e */
  if(Q.rear==Q.front)
    return ERROR;
  e=Q.base[Q.front];
  //e=*(Q.base+Q.front);
  return OK;//返回操作状态(成功:OK,失败:ERROR)
  //....................................
} 

//插入元素e作为队列Q的新的队尾元素
// 前提:队列Q存在且未满
Status EnQueue(SqQueue &Q, ElemType e)
{
  /* TODO (#8#): 元素e入队列 */
  if((Q.rear+1)%MAXQSIZE==Q.front)
    return ERROR;
  //e=*(Q.base +Q.rear);
  Q.base[Q.rear]=e;
  Q.rear=(Q.rear+1)%MAXQSIZE;
  return OK;//返回操作状态(成功:OK,失败:ERROR)
  //....................................
} 

//删除队列Q的队头元素,并用e返回
// 前提:队列Q存在且非空
Status DeQueue(SqQueue &Q, ElemType e)
{
  /* TODO (#9#): 出队列存入e */
  if(Q.front==Q.rear)
    return ERROR;
  //e=*(Q.base+Q.front);
  e=Q.base[Q.front];
  Q.front=(Q.front+1)%MAXQSIZE;
  return OK;//返回操作状态(成功:OK,失败:ERROR)
  //....................................
} 

////////////////////////////////////////// 

//TODO: 定义好 SqQueue 类型后使用 QueueView 函数
/****** //TODO: 删除此行以便使用QueueView()
#include <stdio.h>
//查看队列状态(调试用)
void QueueView(SqQueue Q)
{
  extern void PrintElem(ElemType e);//打印数据用
  int i=0;
  if(Q.front<0||Q.front>=MAXQSIZE||Q.rear<0||Q.rear>=MAXQSIZE){
    printf("队列未初始化\n");
    return ;
  }
  printf("---Queue View---\n");
  printf("front=%d , rear=%d\n", Q.front, Q.rear);
  if(Q.rear>=Q.front) {
    printf(".....  ......\n");
    for(i=Q.front; i<Q.rear; i++) {
      printf("%5d\t", i);
      PrintElem(Q.base[i]);
      printf("\n");
    }
    if(i<MAXQSIZE) printf(".....  ......\n");
  } else {
    for(i=0; i<Q.rear; i++) {
      printf("%5d\t", i);
      PrintElem(Q.base[i]);
      printf("\n");
    }
    printf(".....  ......\n");
    for(i=Q.front; i<MAXQSIZE; i++) {
      printf("%5d\t", i);
      PrintElem(Q.base[i]);
      printf("\n");
    }
  }
  printf("--- view end ---\n");
}
******/ //TODO: 删除此行以便使用QueueView() 

//取消ElemType的默认定义,以免影响其它部分
#ifdef USE_DEFAULT_ELEMTYPE
#undef ElemType
#undef USE_EFAULT_ELEMTYPE
#endif 

#endif //SQQUEUE_H_INCLUDED 

#include <stdio.h>
#include <stdlib.h>
#include "sqqueue.h" 

//初始化系统 

void Finalize(SqQueue &q);  

////////////////////////////////////////////
//主程序
int main()
{
  SqQueue q; //循环队列
  int x; 

  //系统初始化
  InitQueue(q);
  printf("数据元素进队列,以0结束");
  scanf("%d",&x);
  while(x!=0){
   EnQueue(q,x);
   scanf("%d",&x);
  }
  printf("\n队列元素的个数"); 

  printf("%d",QueueLength(q)); 

  printf("\n头元素是:");
  if(!QueueEmpty(q)){
   if(GetHead(q,x)==OK)
   printf("%d",x);
  } 

  printf("\n出队列,先进先出");
   if( DeQueue(q,x)==OK)
     printf("%d",x);
  printf("\n此时的对头是:");
  if(!QueueEmpty(q)){
   if(GetHead(q,x)==OK)
   printf("%d\n",x);
  } 

}

实现的效果:

以上所述就是本文的全部内容了,希望大家能够理解。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索c语言
, 数据结构
循环队列的实现
c语言循环队列的实现、循环队列c语言实现、c语言队列实现、c语言循环队列代码、c语言循环队列,以便于您获取更多的相关知识。

时间: 2024-10-21 14:54:57

如何实现循环队列_C 语言的相关文章

详解数据结构C语言实现之循环队列_C 语言

本文讲的是循环队列,首先我们必须明白下面几个问题 循环队列的基础知识 1.循环队列需要几个参数来确定 循环队列需要2个参数,front和rear 2.循环队列各个参数的含义 (1)队列初始化时,front和rear值都为零: (2)当队列不为空时,front指向队列的第一个元素,rear指向队列最后一个元素的下一个位置: (3)当队列为空时,front与rear的值相等,但不一定为零: 3.循环队列入队的伪算法 (1)把值存在rear所在的位置: (2)rear=(rear+1)%maxsize

深入浅析C语言中堆栈和队列_C 语言

1.堆和栈 (1)数据结构的堆和栈 堆栈是两种数据结构. 栈(栈像装数据的桶或箱子):是一种具有后进先出性质的数据结构,也就是说后存放的先取,先存放的后取.这就如同要取出放在箱子里面底下的东西(放入的比较早的物体),首先要移开压在它上面的物体(放入的比较晚的物体). 堆(堆像一棵倒过来的树):是一种经过排序的树形数据结构,每个结点都有一个值.通常所说的堆的数据结构,是指二叉堆.堆的特点是根结点的值最小(或最大),且根结点的两个子树也是一个堆.由于堆的这个特性,常用来实现优先队列,堆的存取是随意,

stl常用算法(Algorithms)介绍(stl排序算法、非变序型队列)_C 语言

算法:用来处理群集内的元素.它们可以出于不同的目的而搜寻,排序,修改,使用那些元素.是一种应用在容器上以各种方法处理其内存的行为或功能,如sort(排序),copy(拷贝)- 算法由模板函数体现,这些函数不是容器类的成员函数,是独立的函数,它们可以用于STL容器,也可以用于普通的C++数组等. 头文件:#include<algorithm> 在STL的泛型算法中有4类基本的算法: 1)变序型队列算法: 可以改变容器内的数据: 2)非变序型队列算法:处理容器内的数据而不改变他们: 3)排序值算法

C语言循环队列的表示与实现实例详解_C 语言

1.概述: C语言的队列(queue),是先进先出(FIFO, First-In-First-Out)的线性表数据结构.在具体应用中通常用链表或者数组来实现.队列只允许在后端(称为rear)进行插入操作,在前端(称为front)进行删除操作. 循环队列可以更简单的防止伪溢出的发生,但是队列大小是固定的. 2.实例代码: /* 队列的顺序存储结构(循环队列) */ #define MAX_QSIZE 5 /* 最大队列长度+1 */ typedef struct { QElemType *base

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

题目描述:     大家都知道数据结构里面有一个结构叫做循环队列.顾名思义,这是一个队列,并且是循环的.但是现在,淘气的囧哥给这个循环队列加上了一些规矩,其中有5条指令:     (1) Push K, 让元素K进队列.     (2) Pop,对头元素出队列.     (3) Query K,查找队列中第K个元素,注意K的合法性.     (4) Isempty,判断队列是否为空.     (5) Isfull,判断队列是否已满.     现在有N行指令,并且告诉你队列大小是M. 输入:   

C++循环队列实现模型_C 语言

本文实例讲述了C++循环队列实现模型.分享给大家供大家参考.具体分析如下: 前段时间在知乎上看到这样一个小题目: 用基本类型实现一队列,队列要求size是预先定义好的的.而且要求不可以使用语言自带的api,如C++的STL.普通的实现很简单,但是现在要求要尽可能的时间和空间复杂度的优化,要和语言自带的api比较时间和空间.这个队列还要支持如下的操作: constructor: 初始化队列 enqueue:入队 dequeue:出队 队列是一种基本的数据结构,在平常的应用中十分广泛,多数情况队列都

c语言-数据结构循环队列 为什么执行后的结果是这样,不能正确的输出结果

问题描述 数据结构循环队列 为什么执行后的结果是这样,不能正确的输出结果 #include #include #define OK 1 #define ERROR -1 #define OVERFLOW -2 #define INIT_QUEUE_SIZE 5//当前分配的最大空间 #define QUEUEINCREMENT 10 typedef int Status; typedef float QElemType ; typedef struct { QElemType* base;//初

C++队列用法实例_C 语言

本文实例讲述了C++队列用法.分享给大家供大家参考.具体如下: /* 队列使用时必须包含头文件 #include <queue> 有以下几种方法 入队push(),出队pop(), 读取队首元素front(),读取队尾元素back() , 判断队是否有元素empty() 求队列元素个数size() */ #include <iostream> #include <queue> using namespace std; int main() { queue<int&

详解C语言 三大循环 四大跳转 和判断语句_C 语言

三大循环for while 和 do{ }while; 四大跳转 : 无条件跳转语句 go to; 跳出循环语句 break; 继续跳出循环语句 continue; 返回值语句 return 判断语句 if,if else,if else if else if...else ifelse 组合 if(0 == x) if(0 == y) error(): else{ //program code } else到底与那个if配对 C语言有这样的规定: else 始终与同一括号内最近的未匹配的if语