循环顺序队列

#include<iostream>
using namespace std;
const int MAXQSIZE  = 5;
//队列类
template<class T>
struct LinkList
{
	T * data;//指向连续的数据存储区域
	int front;//头指针 指向第一个元素
	int rear;//尾指针 如果队列不为空指向最后元素的下一个位置
};

//构造一个空队列
template<class T>
void InitQueue(LinkList<T> & que)
{
	que.data = (T *)malloc(MAXQSIZE*sizeof(T));
	if(!que.data) exit(0);
	que.front = que.rear= 0;
}
//销毁队列
template<class T>
void DestroyQueue(LinkList<T>& que)
{
	free(que.data);
}
//清空队列
template<class T>
void ClearQueue(LinkList<T>& que)
{
	que.front = que.front= 0;
}
//返回队列的长度
template<class T>
int QueueLength(LinkList<T>& que)
{
	return (que.rear - que.front + MAXQSIZE)%MAXQSIZE;
}
//返回队列的队首元素
template<class T>
T GetHead(LinkList<T>& que)
{
	if(que.front==que.rear)
		throw runtime_error("");
	return que.data[que.front];
}
//元素入队
template<class T>
bool EnQueue(LinkList<T>& que,T t)
{
	if((que.rear+1)%MAXQSIZE == que.front)
	{
		return false;
	}
	que.data[que.rear] = t;
	que.rear = (que.rear+1)%MAXQSIZE;
	return true;
}
//元素出队
template<class T>
bool DeQueue(LinkList<T>& que,T & t)
{
	if(que.front==que.rear)
		return false;
	t = que.data[que.front];
	que.front = (que.front + 1)%MAXQSIZE;
	return true;
}
//从对头到队尾元素遍历调用visit函数
template<class T>
void VisitQueue(LinkList<T>& que,void (*visit)(T &t))
{
	int p = que.front;
	while (p!=que.rear)
	{
		(*visit)(que.data[p]);
		p = (p+1)%MAXQSIZE;
	}
}
//测试函数
template<class T>
void Print(T &t)
{
	cout<<t<<endl;
}
template<class T>
void AddOne(T &t)
{
	t++;
}
int main()
{
//创建一个空的队列
	LinkList<int> queue;
//初始化队列
	InitQueue(queue);
//元素入队
	EnQueue(queue,1);
	EnQueue(queue,2);
	EnQueue(queue,3);
	EnQueue(queue,4);
//返回队列的长度
	cout<<"队列的长度:  "<<QueueLength(queue)<<endl;
//输出所有元素
	VisitQueue(queue,Print<int>);

//返回队列的队首元素
	cout<<"队列的队首元素:  "<<GetHead(queue)<<endl;
//元素出队
	int a ;
	if(DeQueue(queue,a))
	{
	  cout<<"出队元素:  "<<a<<endl;
	}
//返回队列的长度
	cout<<"队列的长度:  "<<QueueLength(queue)<<endl;
//输出所有元素
	VisitQueue(queue,Print<int>);
//元素出队
	if(DeQueue(queue,a))
	{
	  cout<<"出队元素:  "<<a<<endl;
	}
//返回队列的长度
	cout<<"队列的长度:  "<<QueueLength(queue)<<endl;
//输出所有元素
	VisitQueue(queue,Print<int>);

//元素入队
	EnQueue(queue,5);
	EnQueue(queue,6);
	cout<<"5、6元素入队"<<endl;
//返回队列的长度
	cout<<"队列的长度:  "<<QueueLength(queue)<<endl;
//输出所有元素
	VisitQueue(queue,Print<int>);

//将所有元素加一
	cout<<"将所有元素加一"<<endl;
	VisitQueue(queue,AddOne<int>);
//输出所有元素
	VisitQueue(queue,Print<int>);

//清空队列
	ClearQueue(queue);
//销毁队列
	DestroyQueue(queue);
}


循环顺序队列

时间: 2024-11-02 23:52:26

循环顺序队列的相关文章

【小白成长撸】--循环顺序队列

1 // 循环顺序队列.cpp : 定义控制台应用程序的入口点. 2 //适合整数 3 4 #include "stdafx.h" 5 #include<stdio.h> 6 7 #define MAXNUM 100 8 #define true 1 9 #define false 0 10 11 typedef struct queue_type 12 { 13 int queue[MAXNUM];//队列的最大值为100 14 int front;//头指针 15 in

数据结构-循环顺序队列的基本操作

//循环顺序队列的基本操作 #include <iostream> #include <string.h> using namespace std; #define MAXLEN 8 #define datatype char #define Status int typedef struct{ datatype s[MAXLEN]; int front; //记录队首的指针 int rear; //记录队尾的指针 }SeqQueue; //初始化 Status InitSeqQu

C++循环顺序队列

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

数据结构-循环顺序队列&amp;链队列

队列接口实现: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _003_队列 { interface IQueue<T> { int Count { get; } int GetLength(); bool IsEmpty(); void Clear(); void Enqueue(T it

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

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

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

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

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

为了能充分的利用空间,解决顺序队列的"假溢出"问题,可以采用两种方法:一种是将数据向前移动,让空的存储单元留在队尾:另一种是将顺序队列构造成一个环状的空间,即将队列的数据区data[0....MAXSIZE-1]看成头尾相接的循环结构,使得data[0]接在data[MAXSIZE-1]之后,这就是循环队列. 这节就来实现循环顺序队列. 循环队列中的空闲的空间可以被利用,除非数组空间真的被队列元素全部占用,否则不会上溢.因此,队一此简单的应用外,真正实用的顺序队列是循环队列. 入队时,

数据结构--队列实现(顺序队列和链队列)与C++模板

数据结构--队列实现(顺序队列和链队列)与C++模板 一.顺序队列 队列的顺序存储结构称为顺序队列,顺序队列实际上是运算受限的顺序表. ①和顺序表一样,顺序队列用一个向量空间来存放当前队列中的元素. ②由于队列的队头和队尾的位置是变化的,设置两个指针front和rear分别指示队头元素和队尾元素在向量空间中的位置,它们的初值在队列初始化时均应置为0. 注意: ①当头尾指针相等时,队列为空. ②在非空队列里,队头指针始终指向队头元素,尾指针始终指向队尾元素的下一位置.(所以以下循环顺序队列中当队尾

队列的实现:顺序队列

队列也是一种常见的线性表,它和栈相比有以下不同: 队列可以在表的两端进行操作.栈只能在栈顶进行插入和删除. 两端允许操作的类型不一样:可以进行删除的一端称为队头,这种操作也叫出队:可以进行插入的一端称为队尾,这种操作也叫入队.总的来说,队头只能出队,队尾只能入队. 队列的示意图: 模拟队列这种数据结构并不是什么难事,但会遇到一些问题,如: 假溢出 队列中明明还有空间,却因为rear已经指向最后,造成无法入队问题,这是假溢出. 解决办法是:使用链式存储,这显然可以.在顺序存储时,我们常见的解决办法