实验6 循环队列
数据结构--循环队列
![数据结构--循环队列](https://img.taocdn.com/s3/m/16d7ebf8846a561252d380eb6294dd88d1d23d50.png)
数据结构--循环队列⼀.顺序队列的改进队列元素的出列是在队头,即下标为0的位置,那也就意味着,中的所有元素都得向前移动,以保证队列的队头(也就是下标为0的位置)不为空,此时的时间复杂度为0(n)。
可有时想想,为什么出队列时⼀定要全部移动呢,如果不去限制队列的元素必须存储在数组的前n个单元这⼀条件,出队的性能就会⼤⼤增加。
也就是说,队头不需要⼀定在下标为0的位置,⽐如也可以是a[1]等。
⽽为了避免当只有⼀个元素时,队头和队尾重合使处理变得⿇烦,引⼊两个指针,front指针指向队头元素,rear指针指向队尾元素的下⼀个位置,这样当front等于rear时,此队列不是还剩⼀个元素,⽽是空队列。
对于队列最好的⽅法是使⽤链表实现,因为对于数组来说,队列可能会出现下⾯这种情况:假设是长度为5的数组,初始状态,空队列如所⽰,front与 rear指针均指向下标为0的位置。
然后⼊队a1、a2、a3、a4, front指针依然指向下标为0位置,⽽rear指针指向下标为4的位置。
出队a1、a2,则front指针指向下标为2的位置,rear不变,如下图所⽰,再⼊队a5,此时front指针不变,rear指针移动到数组之外。
嗯?数组之外,那将是哪⾥?问题还不⽌于此。
假设这个队列的总个数不超过5个,但⽬前如果接着⼊队的话,因数组末尾元素已经占⽤,再向后加,就会产⽣数组越界的错误,可实际上,我们的队列在下标为0和1的地⽅还是空闲的。
我们把这种现象叫做“”。
不可以继续添加元素,否则会造成数组越界⽽遭致程序出错。
然⽽此时⼜不应该扩充数组,因为还有⼤量实际空间未被占⽤。
此时我们应该如何解决这个问题呢?我们将其实现为循环队列。
解决假溢出的办法就是后⾯满了,就再从头开始,也就是头尾相接的循环。
我们把队列的这种头尾相接的顺序存储结构称为。
也就是利⽤循环来解决空间浪费问题。
⼆.循环队列的引⼊2.1总结来说,什么是循环队列?由于在⽤数组实现队列的时候,队列有元素出列,front就向后移动,所以队列前⾯的空间就空了出来。
循环队列操作实验报告
![循环队列操作实验报告](https://img.taocdn.com/s3/m/9bd3e9a89f3143323968011ca300a6c30d22f150.png)
实验目的:通过本次实验,掌握循环队列的基本概念和操作方法,了解其在实际应用中的优势,并能够熟练运用循环队列解决实际问题。
实验环境:操作系统:Windows 10编程语言:C语言开发环境:Visual Studio实验内容:1. 循环队列的定义及初始化2. 循环队列的入队操作3. 循环队列的出队操作4. 循环队列的判空操作5. 循环队列的判满操作6. 循环队列的遍历操作7. 循环队列的应用实例实验步骤:一、循环队列的定义及初始化1. 定义循环队列的数据结构:```c#define MAX_SIZE 100 // 定义队列的最大容量typedef struct {int data[MAX_SIZE]; // 存储队列元素的数组int front; // 队头指针int rear; // 队尾指针} CircleQueue;```2. 初始化循环队列:```cvoid InitQueue(CircleQueue q) {q->front = q->rear = 0; // 初始化队头和队尾指针}```二、循环队列的入队操作1. 判断队列是否已满:```cint IsFull(CircleQueue q) {return (q->rear + 1) % MAX_SIZE == q->front;}```2. 入队操作:```cint EnQueue(CircleQueue q, int e) {if (IsFull(q)) {return 0; // 队列已满,无法入队}q->data[q->rear] = e; // 将元素e入队q->rear = (q->rear + 1) % MAX_SIZE; // 更新队尾指针return 1; // 入队成功}```三、循环队列的出队操作1. 判断队列是否为空:```cint IsEmpty(CircleQueue q) {return q->front == q->rear;}```2. 出队操作:```cint DeQueue(CircleQueue q, int e) {if (IsEmpty(q)) {return 0; // 队列为空,无法出队}e = q->data[q->front]; // 将队头元素出队q->front = (q->front + 1) % MAX_SIZE; // 更新队头指针 return 1; // 出队成功}```四、循环队列的判空操作1. 判断队列是否为空:```cint IsEmpty(CircleQueue q) {return q->front == q->rear;}```五、循环队列的判满操作1. 判断队列是否已满:```cint IsFull(CircleQueue q) {return (q->rear + 1) % MAX_SIZE == q->front; }```六、循环队列的遍历操作1. 遍历循环队列:```cvoid TraverseQueue(CircleQueue q) {if (IsEmpty(q)) {printf("队列为空,无法遍历。
循环队列实验报告心得与体会
![循环队列实验报告心得与体会](https://img.taocdn.com/s3/m/9939f6caf605cc1755270722192e453611665b4c.png)
循环队列实验报告心得与体会循环队列是数据结构中一个非常经典的概念,相对于其他队列结构,循环队列可以优化存储空间的使用,减少空间的浪费。
循环队列的操作也比较高效,能够快速执行入队和出队操作。
本次实验,我们对循环队列结构进行了深入的了解与实践,更深刻地认识到了数据结构的重要性。
在实验中,我们首先对循环队列的基本概念进行了学习,通过查阅相关资料和教材,我们了解到循环队列是一种环形的特殊队列,其队尾指针在达到数组的末尾时,再从数组的第一个位置开始存储数据,如此循环下去。
这样一来,就可以充分利用数组中的元素,减少不必要的空间浪费,提高队列结构的空间利用率。
在深入了解循环队列的概念之后,我们开始实现循环队列的基本操作,包括入队、出队、判空、判满等。
通过实现这些基础操作,我们更加熟悉了循环队列的内部结构和操作流程,同时也掌握了程序设计中的一些基本思路和技巧。
在实验过程中,我们还注意到了循环队列一些常见的问题和局限性。
当队列元素数量达到数组大小时,会出现队列满的情况,此时需要进行特殊处理。
由于循环队列是基于数组实现的,所以其大小是固定的,不能动态调整,这也是循环队列的一个缺陷。
在实验结束后,我们对循环队列的性能进行了一些简单分析。
通过测试,我们发现循环队列在入队和出队操作的时间复杂度都是O(1),即不受元素数量的影响,具有较高的效率。
这进一步证明了循环队列是一种高效的数据结构。
本次实验让我们深入了解了循环队列的内部结构和基本操作,也发现了循环队列存在的问题和局限性。
通过这次实验的实践,我们进一步理解了数据结构的重要性,同时也锻炼了自己的程序设计能力和思维能力。
除了实现循环队列的基本操作,我们还对循环队列进行了扩展,添加了一些实用的操作,比如获取队列长度、获取队首和队尾元素等。
这些操作虽然不是必要的,但是在实际的应用中却非常实用,可以方便我们处理队列中的元素。
我们在实验中还掌握了一些编程技巧和调试工具,来提高程序的效率和可靠性。
循环队列
![循环队列](https://img.taocdn.com/s3/m/fceeef2daf45b307e8719796.png)
循环队列一、程序思路(1)循环队列循环队列就是将数组看成是首尾相接的循环结构,允许队列直接从下标最大的位置延续到下标最小的位置。
它有效地解决了“假溢出”:当元素被插入到数组下标最大的位置上之后,队列的空间就用尽了,尽管此时数组的低端还有空闲空间。
(2)设置队头和队尾指针入队和出队时,不需要移动任何元素,只是改变队头和队尾两个指针所指向的位置。
并约定:队头front指向队头元素的前一个位置,队尾rear指向队尾元素。
它们有效地解决了顺序出队列的时间复杂度为O(n)的问题,使得入队和出队的时间复杂度均为O(1)。
(3)队满和队空的判定问题若队满和队空的判定条件均是front==rear,则存在二义性。
可以用以下三种方法解决:1.计数器法使用一个计数器count来记录队列中元素的个数;入队时,count加1;出队时,count减1。
此时,队满的条件是front==rear&& count==MaxSize;队空的条件是front==rear&& count==0。
2.标志位法使用一个bool类型的标志变量flag。
入队时,flag为TRUE,出队时,flag为FALSE。
此时,队满的条件是front==reat && flag==true;队空的的条件是front==rear&& flag==false。
3.多一存储单元法多浪费一个存储单元,即队头元素前一个位置的空间不存储元素。
队满时,(rear+1)%MaxSize==front;队空时,front==rear。
二、源代码1.多一个存储空间constint QueueSize = 10;template<class Type>class SeqQueue{private:Type data[QueueSize]; // 存放队列元素的数组int front, rear; // 队头和队尾指针public:SeqQueue(){front = rear = QueueSize - 1; //初始化空队列,队头和队尾指针均指向数组的高端}~SeqQueue(){}void EnQueue(Type x){if ((rear+1)%QueueSize==front){cerr <<x<<"入队列失败!上溢!"<< endl;return;}else{rear = (rear + 1) % QueueSize;data[rear] = x;cout <<x<<"入队列成功!"<< endl;}}void DeQueue(){if (front == rear){cerr <<"下溢"<< endl;return;}else{front = (front + 1) % QueueSize;cout << data[front] <<"出队列成功!"<< endl;}}Type GetQueue(){if (front == rear){cerr <<"下溢"<< endl;exit(1);}else{return data[(front + 1) % QueueSize];}}bool isEmpty(){return (front == rear) ? true : false;}bool isFull(){return ((rear+1)%QueueSize==front) ? true : false;}};2.计数器constint QueueSize = 10;template<class Type>class SeqQueue{private:Type data[QueueSize]; // 存放队列元素的数组int front, rear; // 队头和队尾指针int count; // 计数器public:SeqQueue(){front = rear = QueueSize - 1; //初始化空队列,队头和队尾指针均指向数组的高端count = 0;}~SeqQueue(){}void EnQueue(Type x){if (front == rear&&count == QueueSize){cerr <<x<<"入队列失败!上溢!"<< endl;return;}else{rear =(rear+1)%QueueSize;data[rear] = x;count++;cout <<x<<"入队列成功!"<< endl;}}void DeQueue(){if (front == rear&&count == 0){cerr <<"下溢"<< endl;return;}else{front = (front + 1) % QueueSize;count--;cout << data[front] <<"出队列成功!"<< endl;}}Type GetQueue(){if (front == rear&&count == 0){cerr <<"下溢"<< endl;exit(1);}else{return data[(front + 1) % QueueSize];}}bool isEmpty(){return (count == 0) ? true : false;}bool isFull(){return (count == QueueSize) ? true : false;}};3.标志位constint QueueSize = 10;template<class Type>class SeqQueue{private:Type data[QueueSize]; // 存放队列元素的数组int front, rear; // 队头和队尾指针bool flag; // 计数器public:SeqQueue(){front = rear = QueueSize - 1; //初始化空队列,队头和队尾指针均指向数组的高端flag = false;}~SeqQueue(){}void EnQueue(Type x){if (front == rear&&flag == true){cerr <<x<<"入队列失败!上溢!"<< endl;return;}else{rear = (rear + 1) % QueueSize;data[rear] = x;flag = true;cout <<x<<"入队列成功!"<< endl;}}void DeQueue(){if (front == rear&&flag==false){cerr <<"下溢"<< endl;return;}else{front = (front + 1) % QueueSize;flag=false;cout << data[front] <<"出队列成功!"<< endl;}}Type GetQueue(){if (front == rear&&flag==false){cerr <<"下溢"<< endl;exit(1);}else{return data[(front + 1) % QueueSize];}}bool isEmpty(){return (front==rear&&flag==false) ? true : false;}bool isFull(){return (front == rear&&flag == true) ? true : false; }};。
单片机循环队列
![单片机循环队列](https://img.taocdn.com/s3/m/117e5506bf1e650e52ea551810a6f524ccbfcb93.png)
单片机循环队列
单片机循环队列是一种在单片机中实现的数据结构,它采用循环方式存储数据,可以高效地进行入队和出队操作。
循环队列由一个固定大小的数组和两个指针组成。
其中,一个指针指向队列的头部(即第一个元素),另一个指针指向队列的尾部(即最后一个元素的下一个位置)。
初始时,这两个指针都指向数组的起始位置。
入队操作通过将新的元素放置到尾部指针所指的位置,并将尾部指针向后移动一位。
如果队列已满,则无法执行入队操作。
此时,可以通过判断头部指针和尾部指针是否相等来确定队列是否已满。
出队操作通过将头部指针向后移动一位,并返回头部指针所指的元素值。
如果队列为空,则无法执行出队操作。
此时,可以通过判断头部指针和尾部指针是否相等来确定队列是否为空。
循环队列的好处是可以充分利用数组的空间,减少内存的浪费。
当尾部指针达到数组的末尾时,新的元素可以从数组的起始位置开始存储,形成循环。
这样,即使数组中还有剩余的空间,也能够继续入队元素。
在单片机中实现循环队列时,需要注意对指针的移动操作,以及判断
队列是否已满或为空的条件。
可以使用取模运算来实现循环的效果,确保指针能够正确地移动到数组的起始位置。
总而言之,单片机循环队列是一种高效的数据结构,适用于在单片机中需要频繁执行入队和出队操作的场景。
它通过循环利用数组空间,提高了内存的利用率,并且可以通过简单的指针操作实现队列的功能。
循环队列判空和判满条件
![循环队列判空和判满条件](https://img.taocdn.com/s3/m/a60a27c003d276a20029bd64783e0912a2167c2b.png)
循环队列判空和判满条件循环队列是一种经常使用的数据结构,它具有环形的特点。
在实际应用中,判断循环队列的空和满条件非常重要,因为只有在了解了这些条件后,我们才能正确地对循环队列进行操作。
本文将介绍循环队列的判空和判满条件,并提供相应的代码示例。
一、循环队列的定义和基本操作循环队列是一种使用数组实现的队列,它的特点是充分利用数组空间,将队列头尾相连,形成一个环。
下面是循环队列的基本操作:1. 初始化:创建一个队列,并设置队列的头指针(front)和尾指针(rear)为0。
2. 入队操作:将元素插入到队列的尾部,并将尾指针(rear)向后移动一位。
3. 出队操作:删除队列的头部元素,并将头指针(front)向后移动一位。
4. 判空:当头指针(front)和尾指针(rear)相等时,表示队列为空。
5. 判满:当尾指针(rear)的下一位等于头指针(front)时,表示队列已满。
二、循环队列判空和判满条件的分析1. 判空条件对于判断循环队列是否为空,我们只需判断头指针(front)和尾指针(rear)是否相等即可。
如果相等,表示队列为空;反之,队列不为空。
2. 判满条件判断循环队列是否已满需要特殊处理。
当队列尾指针(rear)的下一位等于队列头指针(front)时,表示队列已满。
由于是循环队列,尾指针(rear)在移动时会环绕到数组的开头,因此我们需要通过模运算来计算下一位的位置。
三、循环队列判空和判满条件的代码实现(C++示例)```cpp#include<iostream>using namespace std;const int MaxSize = 100; // 循环队列的最大容量class CircularQueue {private:int queue[MaxSize]; // 队列数组int front; // 头指针int rear; // 尾指针public:CircularQueue() {front = rear = 0; // 初始化队列}// 入队操作void enqueue(int value) {if ((rear + 1) % MaxSize == front) {cout << "Queue is full. Unable to enqueue." << endl; return;}queue[rear] = value;rear = (rear + 1) % MaxSize;}// 出队操作void dequeue() {if (front == rear) {cout << "Queue is empty. Unable to dequeue." << endl; return;}int value = queue[front];front = (front + 1) % MaxSize;cout << "Dequeued element: " << value << endl; }// 判空操作bool isEmpty() {return front == rear;}// 判满操作bool isFull() {return (rear + 1) % MaxSize == front;}};int main() {CircularQueue queue;queue.enqueue(1);queue.enqueue(2);queue.enqueue(3);queue.dequeue();queue.dequeue();queue.dequeue();queue.dequeue();return 0;}```四、总结循环队列是一种常用的数据结构,因其能够充分利用数组空间并实现高效的入队和出队操作而被广泛应用。
循环队列基本操作的实现
![循环队列基本操作的实现](https://img.taocdn.com/s3/m/f94d2e6183c4bb4cf6ecd133.png)
break;
case 4: //输出队头元素
if(GetHead(Q,e))
cout<<"队头元素为:"<<e<<endl;
else
cout<<"当前队列为空队列,没有队头元素"<<endl;
break;
case 5: //输出队尾元素
if(GetTail(Q,e))
}
int main()
{
SqQueue Q; //定义循环队列Q
int k;
char e;
bool flag;
InitQueue(Q); //初始化循环队列Q
cout<<"循环队列Q初始化成功"<<endl;
//循环显示菜单,完成循环队列的一系列操作
do{
showmenu();
cout<<"请选择要执行的操作序号"<<endl;
bool DeQueue(SqQueue &Q,char &e)
{
if(Q.front==Q.rear)
return false;
e = Q.base[Q.front];
Q.front = (Q.front+1)%MAXSIZE;
return true;
}
//取循环队列Q的队头元素,用参数e返回取得的队头元素
bool GetHead(SqQueue Q,char &e)
{
if(Q.front!=Q.rear)
{
e=Q.base[Q.front];
循环队列详解及队列的顺序表示和实现
![循环队列详解及队列的顺序表示和实现](https://img.taocdn.com/s3/m/0c764ec7b8f3f90f76c66137ee06eff9aef849d8.png)
循环队列详解及队列的顺序表⽰和实现循环队列——队列的顺序表⽰和实现前⾯分析顺序队的时候,我们知道,顺序队存在”假溢出”的问题,这个问题有时会造成很⼤的内存浪费,循环队列就是为了解决这个问题⽽提出地⼀个很巧妙的办法.循环队列和顺序队列的主要区别在于:循环队列将顺序队列臆造成⼀个环状空间.在操作上这种异同体现在:相同点:在顺序队列和循环队列中,进⾏出队、⼊队操作时,队⾸、队尾指针都要加 1 ,朝前移动。
不同点:1. 在循环队列中当队⾸、队尾指针指向向量上界(MAX_QUEUE_SIZE-1) 时,其加1 操作的结果是指向向量的下界 0 。
⽽在顺序队列中,说明队已满,若此时采⽤的是动态顺序链,可以增加申请内存.若是采⽤静态顺序链,只能退出程序.2. 顺序队列中q.front = q.rear 表⽰队空,q.rear = MAX_QUEUE_SIZE表⽰队满.⽽在循环队列中.front=q.rear表⽰队空,⽽⽆法⽤.rear=MAX_QUEUE_SIZE表⽰队满.判断循环队列队满的两种⽅法(本⽂采⽤第⼆种⽅法):1.另设⼀个标志位以区分队列是空还是满2.少⽤⼀个元素空间,约定以”队列头指针在队列尾指针的下⼀位置上”,作为队列呈满状态的标志.第⼆种⽅法的实现:◆ rear 所指的单元始终为空。
◆循环队列为空: front=rear 。
◆循环队列满: (rear+1)%MAX_QUEUE_SIZE=front 。
循环队列操作及指针变化情况如下图所⽰:循环队列虽然可以解决”假溢出”问题,但是它不能通过动态分配的⼀维数组来实现,所以在实现循环队列之前,⼀定要为它设定⼀个最⼤队列长度.如果⽆法预估所需的最⼤队列长度,只能采⽤来链表实现.代码实现:循环队列和顺序队列的头⽂件是⼀样的/* 循环队列的接⼝定义头⽂件 */#define true 1#define false 0/* 队的最⼤长度 */#define MAX_QUEUE_SIZE 6/* 队列的数据类型 */typedef int datatype;/* 静态链的数据结构 */typedef struct queue{datatype sp_queue_array[MAX_QUEUE_SIZE];/* 队头 */int front;/* 队尾 */int rear;}cir_queue;/* 静态顺序链的接⼝定义 *//* 静态链的初始化 */cir_queue queue_init();/* 判断队列是否为空,若为空* 返回true* 否则返回false*/int queue_empty(cir_queue q);/* 插⼊元素e为队q的队尾新元素* 插⼊成功返回true* 队满返回false*/int queue_en(cir_queue *q, datatype e);/* 队头元素出队* ⽤e返回出队元素,并返回true* 若队空返回false*/int queue_de(cir_queue *q, datatype *e);/* 清空队 */void queue_clear(cir_queue *q);/* 获得队头元素* 队列⾮空,⽤e返回队头元素,并返回true* 否则返回false*/int get_front(cir_queue, datatype *e );/* 获得队长 */int queue_len(cir_queue q);/* 遍历队 */void queue_traverse(cir_queue q, void(*visit)(cir_queue q)); void visit(cir_queue s);/* 循环队列的接⼝实现⽂件 */#include<stdio.h>#include<stdlib.h>#include"cir_queue.h"cir_queue queue_init(){cir_queue q;q.front = q. rear = 0;return q;}int queue_empty(cir_queue q){return q.front == q.rear;}int queue_en(cir_queue *q, datatype e){/* 判断队是否已满 */if (q -> front == (q -> rear + 1) % MAX_QUEUE_SIZE) return false;/* ⼊队 */q -> sp_queue_array[q -> rear] = e;q -> rear = (q -> rear + 1) % MAX_QUEUE_SIZE;return true;}int queue_de(cir_queue *q, datatype *e){/* 判断队列是否为空 */if(q -> front == q -> rear)return false;/* ⽤e返回队头元素 */*e = q -> sp_queue_array[q -> front];q -> front = (q -> front + 1 ) % MAX_QUEUE_SIZE;return true;}void queue_clear(cir_queue *q){q -> front = q -> rear = 0;}int get_front(cir_queue q, datatype *e){/* 判断队列是否为空 */if (q.front == q.rear)return false;*e = q.sp_queue_array[q.front];return true;}int queue_len(cir_queue q){/* 若front > rear */if(q.front > q.rear)return (q.rear + MAX_QUEUE_SIZE - q.front);elsereturn (q.rear - q.front);}void queue_traverse(cir_queue q, void(*visit)(cir_queue q)) {visit(q);}void visit(cir_queue q){while(q.front != q.rear){printf("%d ",q.sp_queue_array[q.front]);q.front = (q.front + 1) % MAX_QUEUE_SIZE;}}int main(){cir_queue q = queue_init();queue_en(&q, 1);queue_en(&q, 2);queue_en(&q, 3);queue_en(&q, 4);queue_en(&q, 5);printf("此时队长:length=%d\n", queue_len(q));queue_traverse(q, visit);printf("元素6再⼊队\n");queue_en(&q, 6);queue_traverse(q, visit);datatype *x = (datatype *)malloc(sizeof(*x));queue_de(&q,x);printf("出队:%d,此时队长=%d\n", *x, queue_len(q));printf("元素6再⼊队\n");queue_en(&q, 6);printf("length=%d\n", queue_len(q));queue_traverse(q,visit);datatype *e = (datatype *)malloc(sizeof(*e));queue_de(&q,e);printf("queue_de(),e=%d length=%d\n", *e, queue_len(q)); queue_traverse(q, visit);queue_clear(&q);queue_traverse(q, visit);printf("length:%d\n", queue_len(q));}运⾏截图:感谢阅读,希望能帮助到⼤家,谢谢⼤家对本站的⽀持!。
数据结构:循环队列(C语言实现)
![数据结构:循环队列(C语言实现)](https://img.taocdn.com/s3/m/2b2b29bbcf84b9d529ea7a21.png)
数据结构:循环队列(C语言实现)生活中有很多队列的影子,比如打饭排队,买火车票排队问题等,可以说与时间相关的问题,一般都会涉及到队列问题;从生活中,可以抽象出队列的概念,队列就是一个能够实现“先进先出”的存储结构。
队列分为链式队列和静态队列;静态队列一般用数组来实现,但此时的队列必须是循环队列,否则会造成巨大的内存浪费;链式队列是用链表来实现队列的。
这里讲的是循环队列,首先我们必须明白下面几个问题一、循环队列的基础知识1.循环队列需要几个参数来确定循环队列需要2个参数,front和rear2.循环队列各个参数的含义(1)队列初始化时,front和rear值都为零;(2)当队列不为空时,front指向队列的第一个元素,rear指向队列最后一个元素的下一个位置;(3)当队列为空时,front与rear的值相等,但不一定为零;3.循环队列入队的伪算法(1)把值存在rear所在的位置;(2)rear=(rear+1)%maxsize ,其中maxsize代表数组的长度;程序代码:[cpp]view plaincopy1.bool Enqueue(PQUEUE Q, int val)2.{3.if(FullQueue(Q))4.return false;5.else6. {7. Q->pBase[Q->rear]=val;8. Q->rear=(Q->rear+1)%Q->maxsize;9.return true;10. }11.}4.循环队列出队的伪算法(1)先保存出队的值;(2)front=(front+1)%maxsize ,其中maxsize代表数组的长度;程序代码:[cpp]view plaincopy1.bool Dequeue(PQUEUE Q, int *val)2.{3.if(EmptyQueue(Q))4. {5.return false;6. }7.else8. {9. *val=Q->pBase[Q->front];10. Q->front=(Q->front+1)%Q->maxsize;11.return true;12. }13.}5.如何判断循环队列是否为空if(front==rear)队列空;else队列不空;[cpp]view plaincopy1.bool EmptyQueue(PQUEUE Q)2.{3.if(Q->front==Q->rear) //判断是否为空4.return true;5.else6.return false;7.}6.如何判断循环队列是否为满这个问题比较复杂,假设数组的存数空间为7,此时已经存放1,a,5,7,22,90六个元素了,如果在往数组中添加一个元素,则rear=front;此时,队列满与队列空的判断条件front=rear相同,这样的话我们就不能判断队列到底是空还是满了;解决这个问题有两个办法:一是增加一个参数,用来记录数组中当前元素的个数;第二个办法是,少用一个存储空间,也就是数组的最后一个存数空间不用,当(rear+1)%maxsiz=front时,队列满;[cpp]view plaincopy1.bool FullQueue(PQUEUE Q)2.{3.if(Q->front==(Q->rear+1)%Q->maxsize) //判断循环链表是否满,留一个预留空间不用4.return true;5.else6.return false;7.}附录:queue.h文件代码:[cpp]view plaincopy1.#ifndef __QUEUE_H_2.#define __QUEUE_H_3.typedef struct queue4.{5.int *pBase;6.int front; //指向队列第一个元素7.int rear; //指向队列最后一个元素的下一个元素8.int maxsize; //循环队列的最大存储空间9.}QUEUE,*PQUEUE;10.11.void CreateQueue(PQUEUE Q,int maxsize);12.void TraverseQueue(PQUEUE Q);13.bool FullQueue(PQUEUE Q);14.bool EmptyQueue(PQUEUE Q);15.bool Enqueue(PQUEUE Q, int val);16.bool Dequeue(PQUEUE Q, int *val);17.#endifqueue.c文件代码:[cpp]view plaincopy1.#include<stdio.h>2.#include<stdlib.h>3.#include"malloc.h"4.#include"queue.h"5./***********************************************6.Function: Create a empty stack;7.************************************************/8.void CreateQueue(PQUEUE Q,int maxsize)9.{10. Q->pBase=(int *)malloc(sizeof(int)*maxsize);11.if(NULL==Q->pBase)12. {13. printf("Memory allocation failure");14. exit(-1); //退出程序15. }16. Q->front=0; //初始化参数17. Q->rear=0;18. Q->maxsize=maxsize;19.}20./***********************************************21.Function: Print the stack element;22.************************************************/23.void TraverseQueue(PQUEUE Q)24.{25.int i=Q->front;26. printf("队中的元素是:\n");27.while(i%Q->maxsize!=Q->rear)28. {29. printf("%d ",Q->pBase[i]);30. i++;31. }32. printf("\n");33.}34.bool FullQueue(PQUEUE Q)35.{36.if(Q->front==(Q->rear+1)%Q->maxsize) //判断循环链表是否满,留一个预留空间不用37.return true;38.else39.return false;40.}41.bool EmptyQueue(PQUEUE Q)42.{43.if(Q->front==Q->rear) //判断是否为空44.return true;45.else46.return false;47.}48.bool Enqueue(PQUEUE Q, int val)49.{50.if(FullQueue(Q))51.return false;52.else53. {54. Q->pBase[Q->rear]=val;55. Q->rear=(Q->rear+1)%Q->maxsize;56.return true;57. }58.}59.60.bool Dequeue(PQUEUE Q, int *val)61.{62.if(EmptyQueue(Q))63. {64.return false;65. }66.else67. {68. *val=Q->pBase[Q->front];69. Q->front=(Q->front+1)%Q->maxsize;70.return true;71. }72.}[文档可能无法思考全面,请浏览后下载,另外祝您生活愉快,工作顺利,万事如意!]。
循环队列元素个数的计算方法
![循环队列元素个数的计算方法](https://img.taocdn.com/s3/m/d81cb8bf05a1b0717fd5360cba1aa81145318f63.png)
循环队列元素个数的计算方法循环队列是一种特殊的队列数据结构,它的特点是可以循环利用队列中的空间。
循环队列通常用数组实现,通过维护头指针和尾指针来确定队列的元素个数。
循环队列中的元素个数可以通过以下几种方式进行计算。
1.头尾指针相等:当头指针和尾指针相等时,表示队列为空。
此时队列中的元素个数为0。
2.头指针小于尾指针:当头指针小于尾指针时,表示队列中的元素是连续存储的。
此时队列中的元素个数为尾指针减去头指针。
3.头指针大于尾指针:当头指针大于尾指针时,表示队列中的元素在数组中是分散存储的。
此时队列中的元素个数为数组长度加上尾指针减去头指针。
需要注意的是,头尾指针之间的差值并不代表队列中的元素个数,因为循环队列的尾指针可能回到数组的起始位置。
下面是一个用Python实现的循环队列,并通过不同的方式计算元素个数的示例代码:```pythonclass CircularQueue:def __init__(self, size):self.size = sizeself.queue = [None] * sizeself.head = 0self.tail = 0def is_empty(self):return self.head == self.taildef is_full(self):return (self.tail + 1) % self.size == self.head def enqueue(self, item):if self.is_full(:print("Queue is full")else:self.queue[self.tail] = itemself.tail = (self.tail + 1) % self.sizedef dequeue(self):if self.is_empty(:print("Queue is empty")else:item = self.queue[self.head]self.queue[self.head] = Noneself.head = (self.head + 1) % self.size return itemdef count_elements(self):if self.head == self.tail:return 0elif self.head < self.tail:return self.tail - self.headelse:return self.size + self.tail - self.head #示例用法queue = CircularQueue(5)print(queue.count_elements() # 输出: 0 queue.enqueue(1)queue.enqueue(2)queue.enqueue(3)print(queue.count_elements() # 输出: 3 queue.dequeueprint(queue.count_elements() # 输出: 2```在上述示例中,我们通过计算头尾指针的差值来获得队列中的元素个数。
循环队列
![循环队列](https://img.taocdn.com/s3/m/12579ed250e2524de5187e54.png)
4.实验程序清单
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
typedef int elemtype;
#define M 100
}
q->base[q->rear]=e;
q->rear=(q->rear+1)%M;
return OK;
}
int DeQueue(SeqQueue *q,elemtype *e)
{
if(q->front==q->rear)
{
printf("该队列已空.\n");
return ERROR;
}
*e=q->base[q->front];
●调用函数DeQueue(q,&e)让先入队的元素出队。
●调用函数GetHead(q,&e)弹出队头的元素。
●调用函数QueueEmpty(q)判断对列是否为空。
●调用函数ClearQueue(q)清空队列的内容。
●调用函数QueueLength(q)求队列的深度。
7.试验心得及收获
心得:(1)通过本次实验,理解栈的概念
break;
default:
printf("请选择菜单中的操作,按0退出程序\n");
}
}
}
5.实验程序执行结果
6.执行结果的分析:
●调用void showmenu()显示选择菜单,在main()函数中使用case语句实现菜单项的选择。
循环队列 实验报告
![循环队列 实验报告](https://img.taocdn.com/s3/m/2dcbb9242f60ddccda38a0a7.png)
循环队列#include <iostream>using namespace std;const int QueueSize=10; template <class T>class CirQueue{private :T data[QueueSize];int front,rear;public:CirQueue();~CirQueue(){}T GetQueue();bool Empty();bool Full();int Length();void Insert(T x);T Delete();void Print();};template <class T>CirQueue<T>::CirQueue(){front=rear=0;}template <class T>T CirQueue<T>::GetQueue(){if(front==rear)throw"队列为空!";int i=(front+1)%QueueSize;return this->data[i];}template <class T>bool CirQueue<T>::Empty () {if(rear==front)return true;elsereturn false;}template <class T>bool CirQueue<T>::Full (){if((rear+1)%QueueSize==front)return true;elsereturn false;}template <class T>int CirQueue<T>::Length (){return (this->rear-this->front+QueueSize)%QueueSize; }template <class T>void CirQueue<T>::Insert(T x){if((rear+1)%QueueSize==front)throw "队列上溢!";rear=(rear+1)%QueueSize;data[rear]=x;}template <class T>T CirQueue<T>::Delete (){if(rear==front)throw"队列下溢!";front=(front+1)%QueueSize;return data[front];}template <class T>void CirQueue<T>::Print (){if(rear==front)cout<<"队列为空"<<endl;else{cout<<"***********************************"<<endl;int length=(rear-front+QueueSize)%QueueSize;int count=0;for(int i=(front+1)%QueueSize;;i=(i+1)%QueueSize){if(count>=length)break;cout<<"data["<<i<<"]="<<data[i]<<" ";count++;if(count%5==0)cout<<endl;}cout<<endl;}}void main(){cout<<"************循环队列实验************"<<endl;CirQueue <int>Cq;for(int i=1;i<=9;i++)Cq.Insert (i);Cq.Print();Cq.Delete();Cq.Delete();Cq.Delete();Cq.Insert(-1);Cq.Insert(-2);Cq.Insert(-3);Cq.Print();cout<<endl<<Cq.GetQueue()<<endl;cout<<endl<<Cq.Empty()<<endl;cout<<endl<<Cq.Full()<<endl;}。
循环队列设计实验报告
![循环队列设计实验报告](https://img.taocdn.com/s3/m/bc657d5d0640be1e650e52ea551810a6f524c895.png)
一、实验目的1. 理解循环队列的概念和原理。
2. 掌握循环队列的基本操作,包括初始化、入队、出队、判断队列满和空等。
3. 通过实验加深对队列数据结构在实际应用中的理解。
二、实验环境1. 操作系统:Windows 102. 编程语言:C++3. 开发环境:Visual Studio 2019三、实验内容循环队列是一种利用固定大小的数组实现队列的数据结构。
当队列满时,队列的最后一个元素之后的元素会覆盖队列的第一个元素,形成一个循环。
本实验主要实现以下功能:1. 初始化循环队列。
2. 入队操作(Enqueue)。
3. 出队操作(Dequeue)。
4. 判断队列满和空。
四、实验步骤1. 定义循环队列的结构体,包括队列的最大容量、队列的数组、头指针和尾指针。
```cppstruct LoopQueue {int maxSize; // 队列的最大容量int data; // 队列的数组int front; // 队列的头指针int rear; // 队列的尾指针};```2. 实现初始化函数,初始化队列的最大容量、头指针和尾指针。
```cppvoid initLoopQueue(LoopQueue &queue, int maxSize) {queue.maxSize = maxSize;queue.data = new int[maxSize];queue.front = 0;queue.rear = 0;}```3. 实现入队操作,当队列不满时,将元素添加到队列的尾指针位置,并更新尾指针。
```cppbool enqueue(LoopQueue &queue, int value) {if ((queue.rear + 1) % queue.maxSize == queue.front) {return false; // 队列满}queue.data[queue.rear] = value;queue.rear = (queue.rear + 1) % queue.maxSize;return true;}```4. 实现出队操作,当队列不为空时,返回队列的头指针位置的元素,并更新头指针。
循环队列的实现及细节
![循环队列的实现及细节](https://img.taocdn.com/s3/m/281c8ffe5ff7ba0d4a7302768e9951e79b8969f1.png)
循环队列的实现及细节1. 队列定义:⼀种可以实现 “先进先出” 的存储结构(类似于排队)只允许在⼀端插⼊元素,在另⼀端删除元素,不可以混在⼀起2. 队列分类:链式队列:由链表实现的队列,本质是链表静态队列:由数组实现的队列,本质是数组3. 循环队列讲解1. 静态队列为什么必须时循环队列:静态队列必须是循环队列,这是由数组的特性决定的。
队列只允许尾部添加元素头部删除元素,如果⽤数组实现,添加元素时元素向后排列,删除元素时前⾯的位置就会空出来,时间长了之后会造成⼤量的空间浪费,所以要使⽤循环队列,以防⽌空间浪费⾮循环队列,会浪费很多空间循环队列,不会浪费空间2. 循环队列需要⼏个参数来确定:两个,即队列头、尾(实质上就是数组的两个下标)3. 循环队列各个参数的含义:循环队列需要两个参数来确定,且这两个参数在不同的情况下由不同的含义队列初始化时:front和rear值都为零队列⾮空时:front代表队列第⼀个元素,rear代表队列的最后⼀个有效元素的下⼀个元素队列空时:front和rear相等单不⼀定为零4. 循环队列⼊队伪算法讲解:将值存⼊下标为rear的位置后,rear = (rear+1) %数组长度,⽽不是 rear+15. 循环队列出队伪算法讲解:front = (front + 1) % 数组长度,与⼊队相同6. 如何判断循环队列是否为空:若 rear == front 则队列为空7. 如何判断循环队列是否为满:若(rear + 1)% 数组长度 == front 则队列已满(因为 rear 指⽰的是队列最后⼀个有效元素的下⼀个元素,所以这样判断队列已满会浪费⼀个数组位置,但是这已经⽐⾮循环队列省了很多空间了。
如果要不浪费哪⼀个元素就需要多加⼀个参数,这样就会⿇烦很多,没有必要)4. 循环队列实现及细节#include <stdbool.h>#include <stdio.h>#include <stdlib.h>typedef struct Queue{int *pBase; //指向数组的指针int front; //队列头,数值尾队列第⼀个有效元素的下标int rear; //队列尾,数值尾队列最后⼀个有效元素的下⼀个元素的下标}QUEUE,*PQUEUE;PQUEUE InitQueue(void);/**操作结果:构造⼀个空队列Q */void DestoryQueue(PQUEUE pQ);/**初始条件:队列已经存在* 操作结果:队列被销毁*/void ClearQueue(PQUEUE pQ);/**初始条件:队列已经存在* 操作结果:将队列清空*/bool QueueEmpty(PQUEUE pQ);/**初始条件:队列已经存在* 操作结果:若队列为空,返回TURE,否则返回FALSE*/bool QueueFull(PQUEUE pQ);/**初始条件:队列已存在* 操作结果:若队列已满,返回TURE,否则返回FALSE*/int QueueHead(PQUEUE pQ,int val);/**初始条件:队列存在且⾮空* 操作结果:返回队列头元素*/bool EnQueue(PQUEUE pQ,int val);/**初始条件:队列已存在* 操作结果:在队尾插⼊元素*/bool DeQueue(PQUEUE pQ,int *pVal);/**初始条件:队列存在且⾮空* 操作结果:删除队头元素,并返回其值*/void QueueTraverse(PQUEUE pQ);/**初始条件:队列存在且⾮空* 操作结果:输出队列元素*/int N; //N ⽤于在各个函数之间传递队列的实际长度int main(){int t;printf("请输⼊队列长度:"); //这⾥⽤ N + 1 是因为输⼊的队列长度是实际元素的个数,因为循环队列会浪费⼀个元素,所以令队列的实际长度为 N + 1 ⽅便使⽤ scanf("%d",&t);N=t+1;PQUEUE pQ=InitQueue();int i,n;for(i=0;i<N-1;i++){ //⽤户输⼊的队列长度为 N - 1scanf("%d",&n);EnQueue(pQ,n);}QueueTraverse(pQ);int val;DeQueue(pQ,&val);QueueTraverse(pQ);printf("出队元素为:%d",val);}PQUEUE InitQueue(void) //构造⼀个空队列{PQUEUE pQ=(PQUEUE)malloc(sizeof(QUEUE)); //这⾥必须⽤ malloc 函数,否则⽣成的就是⼀个局部变量。
循环队列的实现与运算 数据结构
![循环队列的实现与运算 数据结构](https://img.taocdn.com/s3/m/5c33f0a176c66137ef06196b.png)
循环队列的实现与运算数据结构电子信息学院实验报告书课程名: 数据结构题目: 循环队列的实现和运算实验类别设计班级: 学号: 姓名:2011年10 月 17 日《算法设计与分析》实验报告 - 1 - 1、实验题目(1) 掌握队列“先进先出”的特点;(2) 复习队列的入队、出队、插入、删除等基本运算。
(3) 掌握循环队列的特点,以及循环队列的应用。
2、实验内容(1) 在顺序存储结构上实现输出受限制的双端循环队列的入队和出队(只允许队头输出)算法。
(2) 设每个元素表示一个待处理的作业,元素值表示作业的预计时间。
入队列采取简化的短作业优先原则,若一个新提交的作业的预计执行时间小于对头和队尾作业的平均时间,则插入在队头,否则插入在队尾。
(3) 循环队列数据类型:#define MAXLEN 10typedef struct{ int data[MAXLEN];int front,rear;}csequeue;(4)入队作业处理的预计执行时间可以用随机数函数rand()产生,也可以从键盘输入。
3、实验要求(1) 利用C(C++)语言完成算法设计和程序设计。
(2) 上机调试通过实验程序。
(3) 输入数据,检验程序运行结果。
(4) 给出具体的算法分析,包括时间复杂度和空间复杂度等。
(5) 撰写实验报告。
4、实验步骤与源程序? 实验步骤首定义MAXLEN=10,然后初始化队列,再定义数据类型、头、尾指针。
下面定义五个函数,分别是入队函数、出队函数、显示函数和长度计算函数。
在入队时要判断是否队满,队满不能入队。
出队要判断队是否为空,队空不能出队。
判断队列长度的函数,用队尾指针与队首指针之差来计算。
最后的主函数是一个队列菜单和相应的对函数的调用,菜单界面主要通过printf()函数来实现,下面一一对应有switch()语句来实现。
? 源代码#include<stdio.h>#define MAXLEN 10typedef struct{ int data[MAXLEN]; // 定义数据的类型int front,rear; // 定义队头、队尾指针 }csequeue;《算法设计与分析》实验报告 - 2 - csequeue q;void IniQueue() // 初始化队列 { q.front=q.rear=MAXLEN-1; }void InQueue() // 入队函数 { int x ;printf("\n\t\t 输入一个入队的整数数据:");scanf("%d",&x);if (q.front==(q.rear+1) % MAXLEN ){ printf("\n\t\t 队满,不能入队! \n"); return; }q.rear=(q.rear+1) % MAXLEN;q.data[q.rear]=x;printf("\n\t\t 入队成功! \n");}void Outsequeue() // 出队函数 { if (q.front==q.rear){ printf ("\n\t\t 此队列为空! "); return ;} // 队空不能出队else{ q.front=(q.front+1) % MAXLEN;printf("\n\t\t 出队元素为:%d\n",q.data[q.front]); // 输出队头元素return;}}void ShowQueue() // 显示函数 { int k=q.front;if (k==q.rear){ printf("\n\t\t 此队列为空! \n"); return;}printf("\n\t\t 此队列元素为:");do{ k=(k+1)%MAXLEN;printf("%4d",q.data[k]);《算法设计与分析》实验报告 - 3 -} while(k!=q.rear);printf("\n");}int length(){ int k;k=(q.rear-q.front+MAXLEN)% MAXLEN;return k;}void main() // 主函数{ int i=1;int choice;IniQueue();while (i){printf("\n\t\t 循环队列\n");printf("\n\t\t***************************************************"); printf("\n\t\t*** 1----------显示 ***");printf("\n\t\t*** 2----------进队 ***");printf("\n\t\t*** 3----------出队 ***");printf("\n\t\t*** 4----------求队列长度 ***");printf("\n\t\t*** 0----------返回 ***");printf("\n\t\t***************************************************"); printf("\n\n\t\t 请选择菜单号: ");scanf("%d",&choice);switch(choice){case 1: ShowQueue(); break;case 2: InQueue(); break;case 3: Outsequeue(); break;case 4: printf("\n\t\t 队列长度为: %d \n",length());break; case 0: i=0; break;《算法设计与分析》实验报告 - 4 -}}}5、测试数据与实验结果(可以抓图粘贴)《算法设计与分析》实验报告 - 5 - 6、结果分析与实验体会程序可以运行,结果正确,在实验中是对五个函数的调用,我在实验中更清楚的认识到队列跟栈的不同,队列是先进先出,栈是后进先出。
循环队列元素个数的计算方法
![循环队列元素个数的计算方法](https://img.taocdn.com/s3/m/42766d367ed5360cba1aa8114431b90d6d85894e.png)
循环队列元素个数的计算方法循环队列是一种特殊的队列,它优化了普通队列在删除元素时需要移动大量元素的问题。
通过循环队列的特定设计,可以在固定长度的数组中,实现对队列元素的循环使用。
循环队列有两个指针,一个是队头指针front,指向队列的第一个元素,一个是队尾指针rear,指向队列最后一个元素的下一个位置。
当队列为空时,front和rear指向同一个位置。
在循环队列中,元素个数的计算方法是通过队头指针front和队尾指针rear的位置关系来计算的。
一、队列为空时当队列为空时,front和rear指向同一个位置,即front == rear。
此时队列中没有任何元素,元素个数为0。
二、队列非空时当队列非空时,有以下两种情况:1. rear > front:队列中的元素是连续存储的,rear指针位于front指针之后。
此时元素个数为rear - front。
2. rear < front:队列中的元素被分为两部分,一部分在数组的末尾,另一部分在数组的开头,形成了环形。
此时元素个数为rear + (队列长度 - front)。
综上所述,循环队列元素个数的计算方法如下:1. 如果front == rear,队列为空,元素个数为0。
2. 如果rear > front,元素个数为rear - front。
3. 如果rear < front,元素个数为rear + (队列长度 - front)。
需要注意的是,计算元素个数时,应该对队列长度取余数,即rear 和front相对于队列长度的余数,以处理rear和front超出队列长度的情况。
例如,假设循环队列的长度为N,队列中有5个元素,front指针为2,rear指针为71. 元素个数计算:rear - front = 7 - 2 = 52. 假设队列的长度为8,队列中有5个元素,front指针为6,rear 指针为3元素个数计算:rear + (队列长度 - front) = 3 + (8 - 6) = 5以上就是循环队列元素个数的计算方法。
简要叙述循环队列的数据结构
![简要叙述循环队列的数据结构](https://img.taocdn.com/s3/m/c90b4951cbaedd3383c4bb4cf7ec4afe04a1b190.png)
简要叙述循环队列的数据结构循环队列是一种基于数组实现的队列数据结构,它具有队列的所有特性,同时还具有循环的特性。
循环队列的主要思想是将队列的头尾相连,形成一个环状结构,这样可以充分利用数组空间,避免了数组满时的浪费。
循环队列的实现需要两个指针:front 和rear。
front 指向队列的头部,rear 指向队列的尾部。
当队列为空时,front 和rear 指向同一个位置。
当队列满时,rear 指向的位置是最后一个元素的下一个位置,而 front 指向的位置不变。
这样,当 rear 指向数组的最后一个位置时,如果还有元素要入队,就会循环回到数组的第一个位置,形成一个环状结构。
循环队列的主要操作包括入队和出队。
入队操作需要将元素插入到队列的尾部,即将元素放到 rear 指向的位置,然后将 rear 指针向后移动一位。
如果队列已满,则无法插入元素。
出队操作需要将队列的头部元素删除,并将 front 指针向后移动一位。
如果队列为空,则无法执行出队操作。
循环队列的优点是可以充分利用数组空间,避免了数组满时的浪费。
同时,由于循环队列的头尾相连,可以在一定程度上提高队列的效率。
循环队列的缺点是实现比较复杂,需要考虑队列满和队列空的情况,同时需要注意指针的移动。
在实际应用中,循环队列常用于缓存、任务队列等场景。
例如,在多线程编程中,可以使用循环队列来实现任务队列,将需要执行的任务放入队列中,然后由线程池中的线程来执行任务。
在网络编程中,可以使用循环队列来实现消息队列,将需要发送或接收的消息放入队列中,然后由网络线程来处理消息。
总之,循环队列是一种非常实用的数据结构,可以在一定程度上提高队列的效率,同时充分利用数组空间,避免了数组满时的浪费。
在实际应用中,循环队列有着广泛的应用场景,是一种非常重要的数据结构。
实验六循环队列
![实验六循环队列](https://img.taocdn.com/s3/m/df4e436f783e0912a2162a76.png)
#include <malloc.h>#include <stdio.h>#define MAXSIZE 20int N;typedef struct {int *base;int front;int rear;}SqQueue;//定义队列bool InitQueue(SqQueue &Q)//初始化队{Q.base=(int*)malloc(MAXSIZE*sizeof(int));if (!Q.base){printf("OVERFLOW\n");return false;}Q.front=0;Q.rear=0;return true;}bool QueueEmpty(SqQueue Q)//判断队是否空{if (Q.front==Q.rear){return true;}elsereturn false;}int GetHead(SqQueue Q,int &e)//取队头元素{if (QueueEmpty(Q)){return -1;}else{e=Q.base[Q.front];return 0;}} int QueueLength(SqQueue Q)//求队长{return(Q.rear-Q.front+MAXSIZE)%MAXSIZE;}bool EnQueue(SqQueue &Q,int e)//入队{if (Q.front==(Q.rear+1)%MAXSIZE){printf("Queue full\n");return false;}Q.base[Q.rear]=e;Q.rear=(Q.rear+1)%MAXSIZE;return true;}bool DeQueue(SqQueue &Q,int &e)//出队{if (Q.front==Q.rear){printf("Queue empty\n");return false;}e=Q.base[Q.front];Q.front=(Q.front+1)%MAXSIZE;return true;}void print_n(int n)//打印N*3个空格{int i;for(i=0;i<n;i++){printf(" ");}}void C_Queue(SqQueue &Q,int e)//生产杨辉三角并输出{int m=0;int pre;int i;printf("%d:",e);print_n(N-e);for(i=0;i<=e;i++){ pre=m;DeQueue(Q,m);printf("%3d ",m);EnQueue(Q,m+pre);}EnQueue(Q,m);printf("\n");}int main(int argc, char* argv[]){SqQueue Q;InitQueue(Q);int i;int n;printf("请输入杨辉三角的阶数(0-12):");scanf("%d",&n);N=n;if (n>12||n<0){printf("输入不合法\n");return -1;}EnQueue(Q,1);for(i=0;i<=N;i++){C_Queue(Q,i);}return 0;}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
if((q.rear+1)%QueueMaxSize==q.front)
cout<<"该循环队列已满!"<<endl;
eห้องสมุดไป่ตู้se
{
q.rear=(q.rear+1)%QueueMaxSize;
q.Queue[q.rear]=e;
}
}
int DeQueue(SeqQueue &q,int &e)
{
if(q.rear==q.front)
#define QueueMaxSize 20
typedef struct
{
int Queue[QueueMaxSize];
int front,rear;
}SeqQueue;
void InitQueue(SeqQueue &q)
{
q.rear=-1;
q.front=-1;
}
void EnQueue(SeqQueue &q,int e)
数据结构算法专题实验报告
实验名称:循环队列评分:________
班级:计科1602班学号:201610333姓名:石博洋
实验内容:
采用顺序存储实现循环队列的初始化、入队、出队操作。
实验源程序:
#include<stdio.h>
#include<stdlib.h>
#include<iostream.h>
cout<<endl;
cout<<"现存的队头元素为"<<DeQueue(q,x)<<endl;
return 0;
}
实验程序执行结果:
实验过程中出现的问题及解决方法:
实验过程中,明显感到自己在编程方面欠缺很大,主要是多C和C++的掌握不够透彻,以至于在编写程序的过程中,不能够正确的定义和使用指针,造成最后在调用函数的时候出现了错误,在今后的学习中,我将进一步强化对C的学习,认真复习指针相关的知识,单链表相对来说比较简单,我相信在以后的学习过程中,我会越学越好。
cout<<"该循环队列为空!"<<endl;
else
{
q.front=(q.front+1)%QueueMaxSize;
e=q.Queue[q.front];
return e;
}
}
int main()
{
int n,m,i,x;
SeqQueue q ;
InitQueue (q);
cout<<"请输入入队列的元素个数:";
cin>>n;
cout<<"该循环队列的元素分别为:";
for(i=0;i<n;i++)
{
cin>>x;
EnQueue(q, x);
}
cout<<"请输入出队列的元素个数:";
cin>>m;
cout<<"该循环出队列的元素分别为:";
for(i=0;i<m;i++)
cout<<DeQueue(q,x)<<" ";