基本数据结构,循环队列的顺序实现。

队列是一种先进先出的数据结构,这里用顺序结构将其实现。

1.首先用结构体定义一个队列,front指向队首元素的前面一位,real指向队尾元素。

1 //队列的结构定义
2 #define MAX 6
3 typedef struct {
4     int front,real;
5     int data[MAX];
6 }queue;

2.创建一个循环队列,初始化令front=real=0,因为当队列满时也有front=real,此时无法判断队满;所以我们弃置一个元素位不用,其位置随机,所以队列的实际最大容量为MAX-1。

1 //队列的初始化
2 void InitQueue(queue *s)
3 {
4     s->front=s->real=0;
5 }

2.入队操作,首先判断队列是否满,此时可能有两种情况:一种是队尾指针到达队首指针的前面一个位置,此时判断条件是  s->real+1==s->front;另一种情况是队尾指针到达该队列的最后一个位置,此时就不能用s->real+1==s->front来判断了,这时可以通过(s->real+1)%MAX==s->front来判断是否队满。若队列不满,则指针下移,下移思路和判断队满一样,移动条件为s->real = (s->real+1)%(MAX),同时给队尾元素赋值。

1 //入队
2 void EnQueue(queue *s,int e){
3     if((s->real+1)%MAX==s->front){
4         printf("队列上溢\n");
5         return ;
6     }
7     s->real = (s->real+1)%(MAX);
8     s->data[s->real] = e;
9 } 

3.判断队空

1 //队列空返回1,不为空返回0。
2 int EmptyQueue(queue *s){
3     if(s->front==s->real){
4         return 1;
5     }
6     return 0;
7 } 

4.出队操作,如果队列下溢,则函数返回;否则将队首指针后移一位,下移思路和上面一致,都是通过取模运算实现。

1 void DeQueue(queue *s){
2     if(EmptyQueue(s)){
3         printf("队列下溢\n");
4         return ;
5     }
6     s->front=(s->front+1)%MAX;
7 } 
时间: 2024-10-14 18:25:56

基本数据结构,循环队列的顺序实现。的相关文章

PHP实现循环队列(顺序结构)

队列:先进先出,是一个应用很广泛的数据结构,不管是存储还是消息,还是待执行任务等等,生活以及软件中使用的栗子比比皆是. 不多说直接上代码,参考多家,觉得这个是最符合中心思想的.为了区分是否满队列,我们还是j决定使用空一格是满的,示意图如下 直接上代码 //循环队列,顺序存储 class queue{ private $data; private $front; private $rear; //定义最大容量     const MAX=5;     //定义数量  //初始化队列,头指针和尾指针

大话数据结构----循环队列和链式队列

队列(Queue) 是只允许在一端进行插入操作,而在另一端进行删除操作的线性表 队列的特点就是:先进先出,和生活中排队的例子是很先进的,排队的目的不就是先到先得吗. 生活中的队列相当于顺序存储的队列,在火车站排队买票,前面的人买完票走了,后面的人一个一个往前移一位,这是很正常的事情,而计算机中队列队列第一个元素出去了,后面的元素一个一个往前移,这是一件很降低效率的一件事.为了解决这种效率问题,计算机采用循环队列的方式操作队数据. 循环队列 队列的头尾相接的顺序存储结构称为循环队列. 1.首先循环

数据结构--循环队列

一.顺序队列的改进 队列元素的出列是在队头,即下标为0的位置,那也就意味着,队列中的所有元素都得向前移动,以保证队列的队头(也就是下标为0的位置)不为空,此时的时间复杂度为0(n). 可有时想想,为什么出队列时一定要全部移动呢,如果不去限制队列的元素必须存储在数组的前n个单元这一条件,出队的性能就会大大增加.也就是说,队头不需要一定在下标为0的位置,比如也可以是a[1]等. 而为了避免当只有一个元素时,队头和队尾重合使处理变得麻烦,引入两个指针,front指针指向队头元素,rear指针指向队尾元

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

工程目录结构图: common.h: 1 //#ifndef __common_h__ 2 //#define __common_h__ 3 4 #define OK 1 5 #define ERROR 0 6 #define TRUE 1 7 #define FALSE 0 8 9 #define MAXSIZE 20 10 11 typedef int Status; //函数的返回结果,OK.ERREO.TRUE.FALSE 12 typedef int ElemType; //结点数据域

数据结构-循环队列程序演示

1 /* 2 循环队列需要2个参数来确定: 3 front,rear 4 1)队列初始化 5 front和rear的值都为零 6 2)队列非空 7 front代表的是队列的第一个元素 8 rear代表的是队列的最后一个有效元素 9 3)队列空 10 front和rear的值相等,但不一定是零 11 */ 12 13 14 /* 15 队列 16 定义:一种可以实现先进先出的存储结构 17 分类: 18 静态队列 19 链式队列 20 */ 21 #include <stdio.h> 22 #i

数据结构:循环队列及其基本操作的实现

/** * 循环队列 * 队列设置first指针直接指向队列头部元素,tail尾指针指向队列最后一个元素的后一个,即队列中总是预留一个空位 */ class CircleQueue implements Queue<Integer>{ private Integer[] queueArray = null; private int first; private int tail; private int maxSize; public CircleQueue(int max){ this.ma

数据结构:C_队列的顺序表示和实现

数据结构:队列的顺序表示和实现(C语言版) 1.写在前面 附:C_队列的链式表示和描述 对于队列最好的方法是使用链表实现,因为对于数组来说,队列可能会出现下面这种情况: 如图所示,不可以继续添加元素,否则会造成数组越界而遭致程序出错.然而此时又不应该扩充数组,因为还有大量实际空间未被占用. 此时我们应该如何解决这个问题呢?我们将其实现为循环队列. 理解: 何谓循环队列?如下图 图中有两个指针(其实就是两个整数型变量,因为在这里有指示作用,所以这里理解为指针)front.rear,一个指示队头,一

链式队列 + 顺序队列 + 顺序循环队列

#include <stdio.h> #include <stdlib.h> #define OK 1 #define FALSE 0 #define ERROR -1 typedef int Status; typedef int QElemType; typedef struct QNode { QElemType data; QNode *next; }*QueuePtr; struct LinkQueue { QueuePtr front,rear;//队头,队尾指针 };

数据结构专题——队列

一.队列(queue)(可与栈对比进行学习) 思想:队列实现的是一种先进先出(first-in,first-out,FIFO)策略.(<算法导论>) 定义:队列是只允许在一端进行插入操作,而在另一端进行删除操作的线性表(具有线性关系/前驱后继关系).(<大话数据结构>) 术语: 队列的两端:队头(head):进行删除操作的一端.队尾(tail):进行插入操作的一端. 操作:队列的插入操作(insert):入队(enqueue). 队列的删除操作(delete):出队(dequeue