队列-队列的顺序表示和实现

和顺序栈相类似,在利用顺序分配存储结构实现队列时,除了用一维数组描述队列中数据元素的存储区域之外,尚需设立两个指针front和rear分别指示“队头”和“队尾”的位置。

为了在C语言中描述方便,在此我们约定:初始化建空队列时,令front=rear=0。每当插入新的队列尾元素时,“尾指针增1”;每当删除队列头元素时,“头指针增1”。因此,在非空队列中,头指针始终指向队列头元素位置,队尾指针始终指向队列尾元素的下一个位置。如图所示:

从图中可以看到,随着入队出队的进行,会使整个队列整体向后移动,这样就出现了循环队列操作示意图(d)中的现象(假溢出现象):队尾指针已经移到了最后,再有元素入队就会出现溢出,而事实上此时队中并未真的“满员”,这种现象为“假溢出”,这是由于“队尾入队头出”这种受限制的操作所造成。解决假溢出的方法之一是将队列看成头尾相接的循环结构,头尾指针的关系不变,将其称为“循环队列”,“循环队列”的示意图如下图所示:

因为是头尾相接的循环结构,

入队时的队尾指针加1操作修改为:q.rear=(q.rear+1) % MAXSIZE;

出队时的队头指针加1操作修改为:q.front=(q.front+1) % MAXSIZE;

设MAXSIZE=10,下图是循环队列操作示意图。

如上图所示的循环队可以看出,(a)中具有a5、a6、a7、a8四个元素,此时front=5,rear=9;随着a9~a14相继入队,队中具有了10个元素--队满,此时front=5,rear=5,如(b)所示,可见在队满情况下有:front==rear。若在(a)情况下,a5~a8相继出队,此时队空,front=9,rear=9,如(c)所示,即在队空情况下也有:front==rear。就是说“队满”和“队空”的条件是相同的了。这显然是必须要解决的一个问题。

方法之一是附设一个存储队中元素个数的变量如num,当num==0时队空,当num==MAXSIZE时为队满。

另一种方法是少用一个元素空间,把图(d)所示的情况就视为队满,此时的状态是队尾指针加1就会从后面赶上队头指针,这种情况下队满的条件是:(q->rear+1) % MAXSIZE == q->front,也能和空队区别开。

队列的顺序存储结构

typedef struct {

QElemtype *base;//初始化的动态分配存储空间

int front;//队头指针

int rear;//队尾指针

}SqQueue;

循环队列的实现

下面的循环队列及操作按第二种方法实现。

#include

#include

#define MAXSIZE 10

#define OK 1

#define ERROR 0

#define OVERFLOW -2

typedef int Status;

typedef int QElemtype;

typedef struct {

QElemtype *base;//初始化的动态分配存储空间

int front;//队头指针

int rear;//队尾指针

}SqQueue;//循环队列

//--------------------循环队列的基本操作的算法描述------------------

Status InitQueue(SqQueue *q)

{//构造一个空队列Q

q->base=(QElemtype*)malloc(MAXSIZE*sizeof(QElemtype));

if(!q->base)exit(OVERFLOW);//存储分配失败

q->front= q->rear =0;

return OK;

}

int queuelength(SqQueue q)

{//返回Q的元素个数,即队列的长度

return (q.rear - q.front + MAXSIZE) % MAXSIZE;

}

Status EnQueue (SqQueue *q,QElemtype e)

{//插入元素e为Q的新的队尾元素

if ((q->rear+1) % MAXSIZE == q->front) return ERROR;//队列满,不进行任何操作,不能再入队

q->base[q->rear]=e;

//入队的操作

q->rear=(q->rear+1) % MAXSIZE;

return OK;

}

Status DeQueue (SqQueue *q,QElemtype *e)

{//若队列不空,则删除Q的对头元素,用e返回其值,并返回OK;否则返回ERROR

if (q->front==q->rear) return ERROR;//队列满

*e=q->base[q->front]; //指针的下标运算

q->front=(q->front+1) % MAXSIZE;

return OK;

}

void display_queue(SqQueue *q){

if(q->front==q->rear){

printf("queue is empty!!\n");

}else {

//遍历该循环队列

int front = q->front;

int rear = q->rear;

while(front!=rear){

printf("%d\n",q->base[front]);

++front;

}

}

}

int main(){

SqQueue q;

InitQueue(&q);

int i;

for(i=0;i<11;i++){

if(EnQueue(&q,i)==ERROR){

printf("循环队列已满,该队列长度为9 \n");

}

}

printf("the length of queue is %d \n",queuelength(q)); //the length of queue is 9

int e1,e2,e3,e4,e5;

DeQueue(&q,&e1);

DeQueue(&q,&e2);

DeQueue(&q,&e3);

DeQueue(&q,&e4);

DeQueue(&q,&e5);

printf("%d--%d--%d--%d--%d \n",e1,e2,e3,e4,e5);

printf("the length of queue is %d \n",queuelength(q));

printf("循环队列的遍历\n");

display_queue(&q);

int e6;

DeQueue(&q,&e6);

printf("循环队列的遍历\n");

display_queue(&q);

system("pause");

return 0;

}

运行结果:

循环队列已满,该队列长度为9

循环队列已满,该队列长度为9

the length of queue is 9

0--1--2--3--4

the length of queue is 4

循环队列的遍历

5

6

7

8

循环队列的遍历

6

7

8

请按任意键继续. . .

注:数学中的余数其实就是取模运算

如,m模n (c语言表示 m%n )

x mod y = x % y

数学中的余数概念和我们的计算机中的余数概念一致,但实现却不一致。

========END========

队列的顺序数组c语言代码,队列-队列的顺序表示和实现相关推荐

  1. c语言while队列不为空,C语言实现循环队列的初始化进队出队读取队头元素判空-2...

    /*顺序表实现队列的一系列操作(设置flag标志不损失数组空间)*/ #include #include #define Queue_Size 50 //队列的最大长度 #define OK 1 #d ...

  2. java数组实现队列_使用数组在Java中进行队列实现

    java数组实现队列 什么是队列? (What is a Queue?) Queue is a special type of data structure, which is designed to ...

  3. c语言变量循环队列的遍历操作,C语言实现循环队列

    对于循环队列有几个操作: 1.初始化 2.入队 3.出队 4.遍历队列 5.判队列空,判队列满 具体如何实现,我会在下面通过代码实现 在对循环队列操作之前,先要建立队列结构体元素, 1 typedef ...

  4. 数值分析-顺序高斯消去法C语言代码

    Gauss消去法 高斯消去法:高斯消去法由消元和回代两个过程组成,前者是对增广矩阵进行初等行变换(交换两行位置:用一个数乘某一行加到另一行上面),使其系数矩阵变为上三角矩阵.可以分为顺序高斯消去法和列 ...

  5. 实现if_数组实现固定栈和队列+栈与队列相互实现

    文章目录 一.数组实现固定栈和队列 1.数组实现固定栈 2.数组实现固定队列 二.栈与队列相互实现 1.两个队列实现栈 2.两个栈实现队列 一.数组实现固定栈和队列 1.数组实现固定栈 代码如下: c ...

  6. Java笔记——Java代码块的执行顺序

    Java代码块的执行顺序 Java程序中代码块的执行顺序对于学习Java的人来说是必不可少需要掌握的. 代码块 在Java中,使用{}括起来的代码被称为代码块. 根据其位置和声明的不同,可以分为: 局 ...

  7. 数据结构 --静态队列的一个简单的C语言代码实现

    静态队列的大概原理和部分算法讲解已经在上一篇博文中讲过了.. http://blog.csdn.net/nvd11/article/details/8816699 这里接上篇文章, 用c语言来实现1个 ...

  8. 数据结构 - 队列简介 及 1个简单的c语言链式队列代码实现

    1. 队列的定义 所谓队列(queue)就是一种能实现"先进先出"的一种线性存储结构. 跟栈有点类似,  例如栈只有1个出入口, 任何元素进入或者离开栈都必须经过同1个出入口(栈顶 ...

  9. 数据结构——队列的C语言代码实现

    系列文章目录 数据结构--顺序表的C语言代码实现 数据结构--八种链表的C语言代码实现 数据结构--栈的C语言代码实现 数据结构--队列的C语言代码实现 数据结构--堆的C语言代码实现 文章目录 系列 ...

最新文章

  1. jittor和pytorch生成网络对比之began
  2. 3-2.6==0.4
  3. 【uva 1617】Laptop(算法效率--贪心,2种理解)
  4. Flutter 底部向上弹出的动画按钮
  5. 带着身体在香港肤浅行走(一)
  6. 西南科技大学oj题66
  7. 前端成长之路之打好根基
  8. xp证书错误补丁_爱思助手 IPA 签名功能常见问题汇总,安卓软件修复南瓜影视无法播放问题,新增皮皮虾xp版,内置皮皮虾伴侣!...
  9. HTML仿腾讯微博首页(Dreamweaver网页作业)
  10. md4 java_求MD4 java实现的代码
  11. 金华市计算机专业的学校有哪些,金华有哪些技校?
  12. 教你成为抖音玩家高手
  13. Volley,Glide,Swiperefreshlayout 简单使用
  14. Z律师:创业项目如何玩转股权众筹?
  15. 图像对抗学习笔记:复现DPatch
  16. STM32基础和常见外设
  17. 百度 oppo 滴滴出行 面试问题总结 阿里
  18. PAT1108 String复读机
  19. R语言的Copula变量相关性分析
  20. 在线学习DITA(英文)

热门文章

  1. python生成表达式_说说 Python 的生成器表达式
  2. 十天学会PHP(第五版),十天学会php之第五天
  3. unityscrollview生成大量_superscrollviewforUGUI的一些使用心得
  4. centos7挂载nas存储_CentOS7搭建NAS文件共享存储
  5. 以下不属于时序逻辑电路的有_电工电子技术(不建议浪费时间学习的科目)
  6. ssm框架里面前端拿HTML写,ssm框架引入Vue,声明式渲染,标签的href拼接字符串
  7. Linux C 中字符串化操作符#
  8. 机器学习复制粘贴笔记要点
  9. Windows Workflow Foundation(WWF)介绍
  10. 一步步编写操作系统 48 二进制程序的加载方式