数据结构-队列的顺序存储(循环队列)

 1 #include "stdio.h"
 2 #include "stdlib.h"
 3
 4 #define OK 1
 5 #define ERROR 0
 6 #define OVERFLOW -1
 7 #define MAXQSIZE 100
 8 typedef int QElemType;
 9 typedef int Status;
10
11 typedef struct
12 {
13     QElemType *base;
14     int front;
15     int rear;
16 }SqQueue;
17
18 Status InitQueue(SqQueue &Q)
19 {
20     Q.base = (QElemType *)malloc(MAXQSIZE * sizeof(QElemType));
21     if(!Q.base)
22         exit(OVERFLOW);
23     Q.front = Q.rear = 0;
24     return OK;
25 }
26
27 Status DestroyQueue(SqQueue &Q)
28 {
29     if(Q.base)
30         free(Q.base);
31     else
32         return ERROR;
33     Q.base = NULL;
34     Q.front = Q.rear = 0;
35     return OK;
36 }
37
38 Status ClearQueue(SqQueue &Q)
39 {
40     Q.front = Q.rear = 0;
41     return OK;
42 }
43
44 bool QueueEmpty(SqQueue Q)
45 {
46     if(Q.front == Q.rear)
47         return true;
48     else
49         return false;
50 }
51
52 int QueueLength(SqQueue Q)
53 {
54     return (Q.rear - Q.front + MAXQSIZE) % MAXQSIZE;
55 }
56
57 Status GetHead(SqQueue Q, QElemType &e)
58 {
59     if(QueueEmpty(Q))
60         return ERROR;
61     e = Q.base[Q.front];
62     return OK;
63 }
64
65 Status EnQueue(SqQueue &Q, QElemType e)
66 {
67     if((Q.rear + 1) % MAXQSIZE == Q.front)
68         return ERROR;
69     Q.base[Q.rear] = e;
70     Q.rear = (Q.rear + 1) % MAXQSIZE;
71     return OK;
72 }
73
74 Status DeQueue(SqQueue &Q, QElemType &e)
75 {
76     if(QueueEmpty(Q))
77         return ERROR;
78     e = Q.base[Q.front];
79     Q.front = (Q.front + 1) % MAXQSIZE;
80     return OK;
81 }

函数用处与之前写的链队列的基本操作函数作用是一样的,一些操作基本上也是重复之前写的顺序存储的,所以在这里没有写任何的注释(其实是懒了),不过也可能你根本看不到这句话,因为复制完代码就走了。

时间: 2024-10-06 21:06:32

数据结构-队列的顺序存储(循环队列)的相关文章

08 队列的顺序存储---循环队列

方法:用数组 + 头指针 + 尾指针 实现的,从尾部插入,从头部删除,先进先出的,FIFO. 循环队列中数据,比数组少1.

队列顺序存储(循环队列)

/* * 2015年4月17日 09:07:17 * 目的:实现循环队列(顺序存储结构),本来我想要在实现循环队列之前 * 先实现队列的顺序存储,但是这种算法有很大的缺点 * 首先会造成假溢出现象 */ /* * 解决队列的相关问题,就是怎么判断队列是否满了或者空了 * 第一种方法: * 我们在队满和对空时都是real = front;这样就不够具体,容易出错 * 所以我们采取牺牲一个存储单元,这样对空时,判断是:real == front * 队满的操作是:(real+1)%maxSize =

【数据结构之旅】循环队列

说明: 时间关系,这里只给出代码及注释,有空的时候再详细介绍一下代码的实现流程. 1.代码及注释 如下: #include<stdio.h> #include<stdlib.h> typedef char ElemType; typedef struct {    ElemType  *elem;  // 存储空间的基址    int front;        // 队头位标    int rear;         // 队尾位标,指示队尾元素的下一位置    int maxS

39 _ 队列5 _ 循环队列需要几个参数来确定 及其含义的讲解.swf

上面讲解都是循环队列,如果是链表实现的话就很简单,队列只有循环队列才比较复杂 此时队列中只存储一个有效元素3,当在删除一个元素的时候,队列为空,pFont向上移动,pFont等于pRear,但是此时pFont的值不为null 1.下面分析下如何向队列中添加元素 我们添加元素的时候只有在pRear的地方添加,pRear向上移动 上面这种情况,pRear已经指向了数组的最尾部分,此时添加数据的时候,pRear不能继续向上加1,执行6的位置,这个时候会出现内存溢出,pRear要执行到数组的0位置第一个

队列学习笔记 循环队列

 //循环队列 //CycQueue.h #define QUEUEMAX 15 typedef struct  { DATA data[QUEUEMAX];  //队列数组  int head; //队头  int tail; //队尾  }CycQueue; CycQueue *CycQueueInit () { CycQueue *q; if(q=(CycQueue *)malloc(sizeof(CycQueue))) //申请保存队列的内存  { q->head = 0;  //设置队

数据结构Java实现07----队列:顺序队列&amp;顺序循环队列、链式队列、顺序优先队列

数据结构Java实现07----队列:顺序队列&顺序循环队列.链式队列.顺序优先队列 一.队列的概念: 队列(简称作队,Queue)也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置插入和删除,而队列只允许在其一端进行插入操作在其另一端进行删除操作. 队列中允许进行插入操作的一端称为队尾,允许进行删除操作的一端称为队头.队列的插入操作通常称作入队列,队列的删除操作通常称作出队列. 下图是一个依次向队列中插入数据元素a0,a1,...,an-

看数据结构写代码(16)顺序队列的实现(循环队列)

循环队列的基本结构如下: front 属性 表示 队头,rear 属性表示 队尾. 在队空时 :q.rear 和 q.front 都为0 ,其余时刻q.rear 指向 队尾的后继节点,q.front指向 队头. 当在队尾插入元素时,q.rear + 1 ,在删除 队头元素时 ,q.front + 1,这样的操作 会造成 "假溢出"问题. 图(d) 就是一种 假溢出 问题,q.rear 指向 空间的边界,再插入 会造成 溢出,但是 实际上 空间 并未满. 为了解决假溢出,将 队列 看成

数据结构-队列(2)-循环队列

循环队列 此前,我们提供了一种简单但低效的队列实现. 更有效的方法是使用循环队列. 具体来说,我们可以使用固定大小的数组和两个指针来指示起始位置和结束位置. 目的是重用我们之前提到的被浪费的存储. 设计循环队列 设计你的循环队列实现. 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环.它也被称为"环形缓冲器".循环队列的一个好处是我们可以利用这个队列之前用过的空间.在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即

数据结构:循环队列(C语言实现)

生活中有非常多队列的影子,比方打饭排队,买火车票排队问题等,能够说与时间相关的问题,一般都会涉及到队列问题:从生活中,能够抽象出队列的概念,队列就是一个能够实现"先进先出"的存储结构.队列分为链式队列和静态队列:静态队列一般用数组来实现,但此时的队列必须是循环队列,否则会造成巨大的内存浪费:链式队列是用链表来实现队列的.这里讲的是循环队列,首先我们必须明确以下几个问题 一.循环队列的基础知识 1.循环队列须要几个參数来确定 循环队列须要2个參数,front和rear 2.循环队列各个參

数据结构:循环队列

数组表示的问题 对于队列最好的方法是使用链表实现,因为对于数组来说,队列可能会出现下面这种情况: 如图所示,不可以继续添加元素,否则会造成数组越界而遭致程序出错.然而此时又不应该扩充数组,因为还有大量实际空间未被占用. 此时我们应该如何解决这个问题呢?我们将其实现为循环队列. 理解循环队列 何谓循环队列?首先我们要说明的是循环队列仍然是基于数组实现的.但是为了形象化的说明问题,我们如下图所示 1.图中有两个指针(其实就是两个整数型变量,因为在这里有指示作用,所以这里理解为指针)front.rea