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

本文讲的是循环队列,首先我们必须明白下面几个问题

循环队列的基础知识

1.循环队列需要几个参数来确定

循环队列需要2个参数,front和rear

2.循环队列各个参数的含义

(1)队列初始化时,front和rear值都为零;

(2)当队列不为空时,front指向队列的第一个元素,rear指向队列最后一个元素的下一个位置;

(3)当队列为空时,front与rear的值相等,但不一定为零;

3.循环队列入队的伪算法

(1)把值存在rear所在的位置;

(2)rear=(rear+1)%maxsize ,其中maxsize代表数组的长度;

程序代码:

bool Enqueue(PQUEUE Q, int val)
{
  if(FullQueue(Q))
    return false;
  else
  {
    Q->pBase[Q->rear]=val;
    Q->rear=(Q->rear+1)%Q->maxsize;
    return true;
  }
} 

4.循环队列出队的伪算法

(1)先保存出队的值;

(2)front=(front+1)%maxsize ,其中maxsize代表数组的长度;

程序代码:

bool Dequeue(PQUEUE Q, int *val)
{
  if(EmptyQueue(Q))
  {
    return false;
  }
  else
  {
    *val=Q->pBase[Q->front];
    Q->front=(Q->front+1)%Q->maxsize;
    return true;
  }
} 

5.如何判断循环队列是否为空

if(front==rear)

队列空;

else

  队列不空;

bool EmptyQueue(PQUEUE Q)
{
  if(Q->front==Q->rear)  //判断是否为空
    return true;
  else
    return false;
} 

6.如何判断循环队列是否为满

 这个问题比较复杂,假设数组的存数空间为7,此时已经存放1,a,5,7,22,90六个元素了,如果在往数组中添加一个元素,则rear=front;此时,队列满与队列空的判断条件front=rear相同,这样的话我们就不能判断队列到底是空还是满了;

解决这个问题有两个办法:

一是增加一个参数,用来记录数组中当前元素的个数;

第二个办法是,少用一个存储空间,也就是数组的最后一个存数空间不用,当(rear+1)%maxsiz=front时,队列满;

bool FullQueue(PQUEUE Q)
{
  if(Q->front==(Q->rear+1)%Q->maxsize)  //判断循环链表是否满,留一个预留空间不用
    return true;
  else
    return false;
} 

附录:

queue.h文件代码:

#ifndef __QUEUE_H_
#define __QUEUE_H_
typedef struct queue
{
  int *pBase;
  int front;  //指向队列第一个元素
  int rear;  //指向队列最后一个元素的下一个元素
  int maxsize; //循环队列的最大存储空间
}QUEUE,*PQUEUE; 

void CreateQueue(PQUEUE Q,int maxsize);
void TraverseQueue(PQUEUE Q);
bool FullQueue(PQUEUE Q);
bool EmptyQueue(PQUEUE Q);
bool Enqueue(PQUEUE Q, int val);
bool Dequeue(PQUEUE Q, int *val);
#endif 

queue.c文件代码:

#include<stdio.h>
#include<stdlib.h>
#include"malloc.h"
#include"queue.h"
/***********************************************
Function: Create a empty stack;
************************************************/
void CreateQueue(PQUEUE Q,int maxsize)
{
  Q->pBase=(int *)malloc(sizeof(int)*maxsize);
  if(NULL==Q->pBase)
  {
    printf("Memory allocation failure");
    exit(-1);    //退出程序
  }
  Q->front=0;     //初始化参数
  Q->rear=0;
  Q->maxsize=maxsize;
}
/***********************************************
Function: Print the stack element;
************************************************/
void TraverseQueue(PQUEUE Q)
{
  int i=Q->front;
  printf("队中的元素是:\n");
  while(i%Q->maxsize!=Q->rear)
  {
    printf("%d ",Q->pBase[i]);
    i++;
  }
  printf("\n");
}
bool FullQueue(PQUEUE Q)
{
  if(Q->front==(Q->rear+1)%Q->maxsize)  //判断循环链表是否满,留一个预留空间不用
    return true;
  else
    return false;
}
bool EmptyQueue(PQUEUE Q)
{
  if(Q->front==Q->rear)  //判断是否为空
    return true;
  else
    return false;
}
bool Enqueue(PQUEUE Q, int val)
{
  if(FullQueue(Q))
    return false;
  else
  {
    Q->pBase[Q->rear]=val;
    Q->rear=(Q->rear+1)%Q->maxsize;
    return true;
  }
} 

bool Dequeue(PQUEUE Q, int *val)
{
  if(EmptyQueue(Q))
  {
    return false;
  }
  else
  {
    *val=Q->pBase[Q->front];
    Q->front=(Q->front+1)%Q->maxsize;
    return true;
  }
} 

以上就是C语言实现循环队列的全部内容,对于学习数据结构与算法的研究有所帮助,有需要的朋友可以参考下。

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

时间: 2024-09-20 06:39:01

详解数据结构C语言实现之循环队列_C 语言的相关文章

如何实现循环队列_C 语言

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

详解C++编程中数组的基本用法_C 语言

可以使用数组下标操作符 ([ ]) 访问数组的各个元素. 如果在无下标表达式中使用一维数组,组名计算为指向该数组中的第一个元素的指针. // using_arrays.cpp int main() { char chArray[10]; char *pch = chArray; // Evaluates to a pointer to the first element. char ch = chArray[0]; // Evaluates to the value of the first e

详解安卓系统中的Android.mk文件_C 语言

概述    Android.mk文件用来向编译系统描述如何编译你的源代码.更确切地说,该文件其实就是一个小型的Makefile.由于该文件会被NDK的编译工具解析多次,因此应该尽量减少源码中声明变量,因为这些变量可能会被多次定义从而影响到后面的解析.这个文件的语法允许把源代码组织成模块,每个模块属于下列类型之一:     APK程序:一般的Android程序,编译打包生成apk文件.     JAVA库:java类库,编译打包生成jar包文件.     C\C++应用程序:可执行的C/C++应用

详解C语言中printf输出的相关函数_C 语言

C语言printf()函数:格式化输出函数printf()函数是最常用的格式化输出函数,其原型为: int printf( char * format, ... ); printf()会根据参数 format 字符串来转换并格式化数据,然后将结果输出到标准输出设备(显示器),直到出现字符串结束('\0')为止. 参数 format 字符串可包含下列三种字符类型: 一般文本,将会直接输出 ASCII 控制字符,如\t.\n 等有特定含义 格式转换字符 格式转换为一个百分比符号(%)及其后的格式字符

详解C++中常量的类型与定义_C 语言

常量是固定值,在程序执行期间不会改变.这些固定的值,又叫做字面量. 常量可以是任何的基本数据类型,可分为整型数字.浮点数字.字符.字符串和布尔值. 常量就像是常规的变量,只不过常量的值在定义后不能进行修改. 整数常量 整数常量可以是十进制.八进制或十六进制的常量.前缀指定基数:0x 或 0X 表示十六进制,0 表示八进制,不带前缀则默认表示十进制. 整数常量也可以带一个后缀,后缀是 U 和 L 的组合,U 表示无符号整数(unsigned),L 表示长整数(long).后缀可以是大写,也可以是小

详解C语言中rand函数的使用_C 语言

前言 我们在编程实现算法的过程中,往往需要使用到随机数.由于计算机是一台以逻辑为基础的机器,没法做到真正的随机(大概量子计算机可以?).所以计算机生成的是伪随机数,供我们使用. 我们使用C语言的rand函数,生成的也是伪随机数. c语言之rand函数的使用 1.写入头文件 #include <stdlib.h> #include <stdio.h> #include <time.h> 2.变量的定义 void main( void ) { int i,k; 3.sran

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

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

详解C++编程中断言static_assert的使用_C 语言

断言和用户提供的消息 C++ 语言支持可帮助您调试应用程序的三个错误处理机制:#error 指令.static_assert 关键字和 assert (CRT) 宏.所有的三种机制都会发出错误消息,其中两个还会测试软件断言.软件断言指定在程序的某个特定点应满足的条件.如果编译时断言失败,编译器将发出诊断消息和编译错误.如果运行时断言失败,操作系统将发出诊断消息并关闭应用程序. 备注 应用程序的生存期由预处理.编译和运行时阶段组成.每个错误处理机制都会访问在这三个阶段之一中可用的调试信息.若要有效

详解C语言中const关键字的用法_C 语言

关键字const用来定义常量,如果一个变量被const修饰,那么它的值就不能再被改变,我想一定有人有这样的疑问,C语言中不是有#define吗,干嘛还要用const呢,我想事物的存在一定有它自己的道理,所以说const的存在一定有它的合理性,与预编译指令相比,const修饰符有以下的优点: 1.预编译指令只是对值进行简单的替换,不能进行类型检查 2.可以保护被修饰的东西,防止意外修改,增强程序的健壮性 3.编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编