• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > 详解数据结构C语言实现之循环队列

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

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了队列详解,数据结构队列,数据结构栈和队列,数据结构队列代码,数据结构队列的应用等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

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

循环队列的基础知识

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; 
  } 
} 
</div>

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; 
  } 
} 
</div>

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

if(front==rear)

队列空;

else

  队列不空;

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

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; 
} 
</div>

附录:

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 
</div>

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; 
  } 
} 
</div>

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

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 详解数据结构C语言实现之循环队列
  • 进程间通信之深入消息队列的详解

相关文章

  • 2017-05-28c++中new的三种用法详细解析
  • 2017-05-28C++ 关于MFC多线程编程的注意事项
  • 2017-05-28C++取得当前时间的方法
  • 2017-05-28C语言 数据类型详细介绍
  • 2017-05-28构造函数定义为private或者protected的好处
  • 2017-05-28C++通过自定义函数求一元二次方程的根
  • 2017-05-28字符串的模式匹配详解--BF算法与KMP算法
  • 2017-05-28c#中实现退出程序后自动重新启动程序的方法
  • 2017-05-28了解C++编程中指定的异常和未经处理的异常
  • 2017-05-28解析C语言中位字段内存分配的问题

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 对一个数组进行zig-zag重新排列
    • 解析C++中指向对象的指针使用
    • C语言读取BMP图像数据的源码
    • C++学习小结之二进制转换
    • C语言实现单链表逆序与逆序输出实例
    • C++ new/delete相关知识点详细解析
    • C++中Cbitmap,HBitmap,Bitmap区别及联系
    • C程序实现整数的素数和分解问题
    • 基于C++类型重定义的使用详解
    • C++命名空间实例解析

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有