数据结构(C实现)------- 顺序队列(循环队列之计数器实现)

为了能充分的利用空间,解决顺序队列的“假溢出”问题,可以采用两种方法:一种是将数据向前移动,让空的存储单元留在队尾;另一种是将顺序队列构造成一个环状的空间,即将队列的数据区data[0....MAXSIZE-1]看成头尾相接的循环结构,使得data[0]接在data[MAXSIZE-1]之后,这就是循环队列。

这节就来实现循环顺序队列。

循环队列中的空闲的空间可以被利用,除非数组空间真的被队列元素全部占用,否则不会上溢。因此,队一此简单的应用外,真正实用的顺序队列是循环队列。

入队时,队尾指针向前追赶队头指针;出队时,队头指针向前追赶队尾指针。因此队空和队满指针均等于队尾指针,无法通过Q->front == Q->rear来判断顺序队列是空还是满。

为了解决这个问题,有3种方法,其一是设一个标识位,以区别顺序队列是空还是满;其二是使用一个计数器记录队列中元素的总数;其三是少用一个元素空间,约定入队前测试队尾指针在循环意义下加1是否等于队头指针,若相等,则认为是队满(注:rear所指的单元始终为空)。

这节,就先采用第二种方法,设一个计数器记录队列中元素的总数,用于判断队列空还是队列满。

顺序队列(循环队列)类型描述:

//顺序队列的类型描述(设立计数器)
#define MAXSIZE 100
typedef int ElemType;
typedef struct{
	ElemType *data;
	int front,rear,count;
}SqQueue;

基本操作:

1. 初始化顺序队列(循环队列) Init_SqQueue(SqQueue* Q)

//初始化顺序队列
void Init_SqQueue(SqQueue* Q){
    Q->data = (SqQueue*)malloc(sizeof(SqQueue) * MAXSIZE);

	Q->front = Q->rear = Q->count = 0;
}

2. 销毁顺序队列(循环队列)Destroy_SqQueue(SqQueue* Q)

//销毁顺序队列
void Destroy_SqQueue(SqQueue* Q){
	if(Q->data){
		free(Q->data);
		Q->front = Q->rear = Q->count = 0;
	}
} 

3. 清空顺序队列(循环队列)Clear_SqQueue(SqQueue* Q)

//清空顺序队列
void Clear_SqQueue(SqQueue* Q){
	Q->front = Q->rear = Q->count = 0;
}

4. 判断顺序队列(循环队列)是否为空IsEmpty_SqQueue(SqQueue* Q)

//判断顺序队列是否为空
int IsEmpty_SqQueue(SqQueue* Q){
	return (Q->count == 0);
}

   5. 判断顺序队列(循环队列)是否已满 iSFull_SqQueue(SqQueue* Q)

//判断顺序队列是否已满
int iSFull_SqQueue(SqQueue* Q){
	return (Q->count == MAXSIZE);
}

6. 求得顺序队列(循环队列)的长度GetLength_SqQueue(SqQueue* Q)

//求得顺序队列的长度
int GetLength_SqQueue(SqQueue* Q){
	return Q->count;
}

  7. 取得顺序队列(循环队列)的的队头GetHead_SqQueue(SqQueue* Q,ElemType *x)

//取得顺序队列的的队头
void GetHead_SqQueue(SqQueue* Q,ElemType *x){
	if(IsEmpty_SqQueue(Q)){
		printf("顺序队列空!\n");
		exit(0);
	}
	else{
		*x = Q->data[Q->front];
	}
}

8. 取得顺序队列(循环队列)的的队尾GetRear_SqQueue(SqQueue* Q,ElemType *x)

//取得顺序队列的的队尾
void GetRear_SqQueue(SqQueue* Q,ElemType *x){
	if(IsEmpty_SqQueue(Q)){
		printf("顺序队列空!\n");
		exit(0);
	}
	else{
		*x = Q->data[Q->rear - 1];
	}
}

9. 入顺序队列(循环队列)En_SqQueue(SqQueue* Q,ElemType x)

//入顺序队列
void En_SqQueue(SqQueue* Q,ElemType x){
	if(iSFull_SqQueue(Q)){
		printf("顺序队列已满!\n");
		exit(0);
	}
	else{
		Q->data[Q->rear] = x;
		Q->rear = (Q->rear + 1) % MAXSIZE;
		Q->count++;
	}
}

10. 出顺序队列(循环队列)De_SqQueue(SqQueue* Q,ElemType *x)

//出顺序队列
void De_SqQueue(SqQueue* Q,ElemType *x){
	if(IsEmpty_SqQueue(Q)){
		printf("顺序队列空!\n");
		exit(0);
	}
	else{
		*x = Q->data[Q->front];
		Q->front = (Q->front + 1) % MAXSIZE;
		Q->count--;
	}
}

11. 打印顺序队列(循环队列)Print_SqQueue(SqQueue* Q)

//打印顺序队列
void Print_SqQueue(SqQueue* Q){
	int i = 0;
	int j = Q->front;

	if(IsEmpty_SqQueue(Q)){
		printf("顺序队列空!\n");
		exit(0);
	}
	else{
		while(i < Q->count){
			printf("%d\t",Q->data[j]);
			j = (j + 1) % MAXSIZE;
			i++;
		}
		printf("\n");
	}
}

以上,就是附设一个计数器指针来实现循环顺序队列。

时间: 2024-11-16 03:20:07

数据结构(C实现)------- 顺序队列(循环队列之计数器实现)的相关文章

数据结构(C实现)------- 顺序队列(循环队列之少用一个存储空间实现) .

上节已经提到有三种方法来实现循环顺序队列,其中第一种设立标识不常用,最常的就是后两种,上一节已经讨论了用计数器来实现循环顺序队列,这节就用第三种方法,也就是少用一个存储空间来实现循环顺序队列,其基本操作和用计数实现类同,下面是具体实现: 顺序队列(循环队列)类型描述: //顺序队列的类型描述 #define MAXSIZE 5 typedef int ElemType; typedef struct{ ElemType *data; int front,rear; }SqQueue; 基本操作:

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

//循环队列 //杨鑫 #include <stdio.h> #include <stdlib.h> #define MAXSIZE 10 typedef int QElemType; typedef struct queue { QElemType elem[MAXSIZE]; int front; int rear; }SqQueue; //定义队头 int init_Queue(SqQueue **q) //初始化 { (*q)->front = 0; (*q)->

Atitit.升级软件的稳定性---基于数据库实现持久化 循环队列 循环队列

Atitit.升级软件的稳定性---基于数据库实现持久化  循环队列 环形队列 1. 前言::选型(马) 1 2. 实现java.util.queue接口 1 3. 当前指针的2个实现方式 1 1.1. 用一个游标last 来指示 (指针表字段last ),麻烦的,不推荐 1 1.2. (简单,推荐)使用循环次数来指示,每循环加1   (字段cirTimes),order by cirtimes 1 4. 表格设计id, cirTimes,createtime,handlerID,recID,d

顺序结构循环队列的基本操作(一)(进队,出队)待优化

#include<stdio.h>#define ElemType int#include<malloc.h>#define MAXSIZE 10typedef struct{ ElemType *data; int front,rear;}Queue;typedef struct BitNode{ ElemType data; struct Bitree *Lchild,*Rchild;}BitNode;Queue Init_queue(Queue Q){ Q.data=(Ele

顺序循环队列

一  顺序表循环队列 1.1 顺序循环队列定义 队列是一种运算受限的先进先出线性表,仅允许在队尾插入(入队),在队首删除(出队).新元素入队后成为新的队尾元素,元素出队后其后继元素就成为队首元素. 队列的顺序存储结构使用一个数组和两个整型变量实现,其结构如下: 1 struct Queue{ 2 ElemType elem[MaxSize]; 3 int head, tail; 4 }; 即利用数组elem顺序存储队列中的所有元素,利用整型变量head和tail分别存储队首元素和队尾(或队尾下一

【数据结构-队列】循环队列

关于循环队列 循环队列就是像一个圈一样,可以一直不停的入队和出队,例如:队列已经满了,如果执行一次出队操作,队列头部就空出来了,这时候就可以把元素继续插入空出来的那里,头指针向后移第二个元素就变成的队列的头,上一个对头就变成了队尾 下图中:此时队列已经满了,但是当把12出队后,head指针会指向第1个位置,这是再忘队列中插入元素的,tail就会指向0的位置,然后把元素插入到0的位置. 组成循环队列需要的元素 int data[COUNT];//存放元素 int head;//头指针 int ta

数据结构(二)栈、队列和数组

栈 栈的定义 栈是限制在表的一端进行插入和删除的线性表.允许插入.删除的这一端称为栈顶,另 一个固定端称为栈底.当表中没有元素时称为空栈. 栈的存储实现和运算实现 栈是运算受限的线性表,线性表的存储结构对栈也是适用的,只是操作不同而已. 利用顺序存储方式实现的栈称为顺序栈. 与线性表类似,栈的动态分配顺序存储结构如 下: #define STACK_INIT_SIZE 100 //存储空间的初始分配量 #define STACKINCREMENT 10 //存储空间的分配增量 typedef s

野生前端的数据结构基础练习(2)——队列

网上的相关教程非常多,基础知识自行搜索即可. 习题主要选自Orelly出版的<数据结构与算法javascript描述>一书. 参考代码可见:https://github.com/dashnowords/blogs/tree/master/Structure/Queue 队列的基本知识 特点: 先进先出. 用途: 模拟流程或其他带有抽象排队属性的事物或逻辑,例如时间循环队列,发布订阅模式的回调队列等等. 基本方法 enqueue()在队尾插入一个元素 dequeue()从队头删除一个元素 get

队列(循环队列)

队列 队列一般分为两类:链式队列和顺序队列 链式队列---链式队列即用链表实现的队列 顺序队列---顺序队列是用数组实现的队列,顺序队列通常必须是循环队列 1.基本概念: 队列是指允许在一端进行插入,在另一端进行删除的线性表,又称"先进先出"的线性表 队列是一种特殊的线性结构,它只允许在队列的首部(head)进行删除操作,这称为出队 队尾:允许插入的一端,用尾指针指向队尾元素的后一位置 排头:允许删除的一端,用头指针指向头元素 循环队列(顺序队列)的实现: 1 #include <