顺序队

顺序队所尊崇的结点如图

所实现的功能如下:

bool IsFull(Queue *Q);//判满

bool IsEmpty(Queue *Q);//判空

void InitQueue(Queue *Q);//初始化

bool EnQueue(Queue *Q, ElemType x);//入队

bool DeQueue(Queue *Q, ElemType *v);//出队并返回值

bool DeQueue1(Queue *Q);//直接出队

void Show(Queue *Q);//打印

void DestroyQueue(Queue *Q);//摧毁

void ClearQueue(Queue *Q);//删除

具体的代码如下:

头文件:

#pragma once

//循环队列(空闲单元法)
#include<iostream>
using namespace std;

typedef int ElemType;
#define QUEUE_INIT_SIZE 8

typedef struct Queue
{
	ElemType *base;
	size_t capacity;
	int front;
	int rear;
}Queue;

bool IsFull(Queue *Q);//判满
bool IsEmpty(Queue *Q);//判空
void InitQueue(Queue *Q);//初始化
bool EnQueue(Queue *Q, ElemType x);//入队
bool DeQueue(Queue *Q, ElemType *v);//出队并返回值
bool DeQueue1(Queue *Q);//直接出队
void Show(Queue *Q);//打印
void DestroyQueue(Queue *Q);//摧毁
void ClearQueue(Queue *Q);//删除

函数定义文件:

#include "SeqQueue.h"

bool IsFull(Queue *Q)                                         //判满
{
	return ((Q->rear+1)%(Q->capacity)) == Q->front;           //满足时为满
}

bool IsEmpty(Queue *Q)                                        //判空
{
	return Q->front == Q->rear;                               //相等时
}

void InitQueue(Queue *Q)                                      //初始化
{
	Q->capacity = QUEUE_INIT_SIZE;                            //队长
	Q->base = (ElemType*)malloc(sizeof(ElemType)*Q->capacity);//队空间的开辟
	Q->front = 0;                                             //队头
	Q->rear = 0;                                              //队尾
}

bool EnQueue(Queue *Q, ElemType x)                                //入队
{
	if(IsFull(Q))                                             //判满
	{
		cout<<"队列已满,不能入队!"<<endl;
		return false;
	}
	Q->base[Q->rear] = x;                                     //入队赋值
	Q->rear = (Q->rear+1)%Q->capacity;                        //重新循环指向
	return true;
}

bool DeQueue(Queue *Q, ElemType *v)                           //出队并返回出队数值
{
	if(IsEmpty(Q))                                            //判空
	{
		cout<<"队列已空,不能出队!"<<endl;
		return false;
	}
	*v = Q->base[Q->front];                                   //赋值
	Q->front = (Q->front+1) % Q->capacity;                    //重新循环指向
	return true;
}

bool DeQueue1(Queue *Q)//直接出队
{
	if(IsEmpty(Q))                                            //判空
	{
		cout<<"队列已空,不能出队!"<<endl;
		return false;
	}
	Q->front = (Q->front+1) % Q->capacity;
	return true;
}

void Show(Queue *Q)                                           //打印
{
	for(int i=Q->front; i!=Q->rear;)                          //队头到队尾
	{
		cout<<Q->base[i]<<" ";
		i = (i+1)%Q->capacity;                                //处理i,循环打印
	}
	cout<<endl;
}

void DestroyQueue(Queue *Q)                                   //摧毁队列
{
	free(Q->base);
	Q->base = NULL;
	Q->capacity = Q->front = Q->rear = 0;
}

void ClearQueue(Queue *Q)                                     //清除队列
{
	Q->rear = Q->front;
}

测试文件:

#include"SeqQueue.h"

void main()
{
	ElemType value;
	Queue Q;
	InitQueue(&Q);

	EnQueue(&Q,1);
	EnQueue(&Q,2);
	EnQueue(&Q,3);
	EnQueue(&Q,4);
	EnQueue(&Q,5);
	Show(&Q);
	DeQueue1(&Q);
	DeQueue(&Q,&value);
	cout<<value<<"出队!"<<endl;
	DeQueue(&Q,&value);
	cout<<value<<"出队!"<<endl;
	DeQueue(&Q,&value);
	cout<<value<<"出队!"<<endl;
	DeQueue(&Q,&value);
	cout<<value<<"出队!"<<endl;

	EnQueue(&Q,6);
	EnQueue(&Q,7);
	EnQueue(&Q,8);
	EnQueue(&Q,9);

	Show(&Q);
}

对于具体的操作,测试文件写得很清楚,在这里便不用截图说明了。代码有什么问题,希望大家可以指出,谢谢。

时间: 2024-12-18 15:45:11

顺序队的相关文章

数据结构-顺序队

#include<stdio.h> #define MaxSize 15 typedef struct SqQueue{ int data[MaxSize]; int front; int rear; }SqQueue,*SQueue; //初始化 void init(SqQueue &S){ S.front = 0; S.rear = S.front; } //判断队空 int isQueueEmpty(SqQueue S){ if(S.front == S.rear){ retur

C++循环顺序队列

顾名思义:采用顺序结构存放的队列称为顺序队列 循环顺序队列可以避免队列的假溢出现象的发生.如下图示,循环队列的几种特殊情况. 学习完顺序循环队列个人感觉应该注意的事项: front.rear只是表示在base[i]这个顺序表中的索引值,而不是内存的绝对地址,这样也才在后面的循环的时候处理起来比较方便 队列循环的关键 front=(front+1)%queueSize; 下面是个人的循环队列操作工程文件: //////////////////////////////////////////////

C#队列

队列(Queue)是插入操作限定在表的尾部而其它操作限定在表的头部进行的线性表.把进行插入操作的表尾称为队尾(Rear),把进行其它操作的头部称为队头(Front).当对列中没有数据元素时称为空对列(Empty Queue).对列的操作是按照先进先出(First In First Out)或后进后出( Last In Last Out)的原则进行的,因此,队列又称为FIFO表或LILO表.队列Q的操作示意图如图所示. 队列的形式化定义为:队列(Queue)简记为 Q,是一个二元组, Q = (D

数据结构实践项目——队列

本组项目针对<数据结构基础系列(3):线性表>中的7-12课: 7.队列的定义 8. 顺序队的存储及基本操作 9. 环形队列的存储及基本操作 10. 队列的链式存储结构及其基本运算的实现 11. 队列的应用-迷宫问题 12. 双端队列 [项目1 - 建立顺序环形队列算法库] 定义顺序环形队列存储结构,实现其基本运算,并完成测试. 要求: 1.头文件sqqueue.h中定义数据结构并声明用于完成基本运算的函数.对应基本运算的函数包括: void InitQueue(SqQueue *&q

数据结构与算法01--堆栈 &amp; 队列

基于顺序表的堆栈 基于链式表的堆栈 1 基于顺序表的堆栈 栈是一种特殊的线性表,是限定在线性表表尾进行插入删除操作的线性表.由栈的概念衍生出几个子概念,它们是: 1)栈顶,即允许进行插入.删除操作的一端,又称为表尾,用栈顶指针(top)来指示栈顶元素. 2)栈底,即固定端,又称为表头 3)空栈,即栈当中没有数据元素. 顺序栈是采用顺序存储结构的栈,即使用一组连续的存储单元(一般使用数组)来模拟栈,依次存放栈中的数据元素. 1.1 方案 顺序栈的基本操作包括: 1) 初始化操作,在初始化操作中将建

数据结构例程——迷宫问题(用队列)

本文针对数据结构基础系列网络课程(3):栈和队列中第11课时队列的应用-迷宫问题. 例:求出从入口到出口的路径 代码: #include <stdio.h> #define MaxSize 100 #define M 8 #define N 8 int mg[M+2][N+2]= { {1,1,1,1,1,1,1,1,1,1}, {1,0,0,1,0,0,0,1,0,1}, {1,0,0,1,0,0,0,1,0,1}, {1,0,0,0,0,1,1,0,0,1}, {1,0,1,1,1,0,0

队列的基本运算实现

队列(queue) 队列是一种先进先出(first in first out,FIFO)的线性表.它只允许在表的一端(队尾/rear)插入元素,而在另一端(队头/front)删除元素.插入操作称为入队或进队,删除操作称为出队或离队.队列示意图如下: 1. 顺序队 队列的顺序存储结构需要使用一个数组和两个整型变量来实现,数组用于存储队列中的所有元素,两个整型变量分别用于存储队头元素和队尾元素的下标位置,分别称为队头指针和队尾指针. 假定队列的元素个数不超过MaxSize,所有的元素的数据类型都是E

数据结构(c语言描述)

数据结构(c语言描述) 目录 预备的数学知识 什么是数据结构 线性表 栈和队列 数组 串 树和二叉树 查找 排序 预备的数学知识 等差数列求和 Sn=(a1+an)*n/2 等比数列求和 Sn=a1*(1-q?)/(1-q) 什么是数据结构 基本概念 数据: 能够被计算机识别和处理的符号的集合 数据元素:是数据的基本单位,由若干的数据项构成,如一个人有手有脚 数据对象:由同类型的数据元素组成的集合,如一群人 数据类型:由一个集合和定义在此集合上的操作组成 原子类型:值不可再分的数据类型,如int

数据结构基础(一)

线性表 线性顺序表 1.线性表的数据操作 2.使用定义的函数实现两个集合LA和LB的合并: void unionList(List LA,List LB,List &LC) { int lena,i; ElemType e; InitList(LC); //将LA的所有元素插入到LC中 for (i=1;i<=ListLength(LA);i++) { GetElem(LA,i,e); ListInsert(LC,i,e); } lena=ListLength(LA); //将LB的所有元素