数据结构:循环队列的顺序存储结构

队列只允许在队尾插入,在队头删除
循环队列防止假溢出现象
顺序存储结构用数组实现

#include <iostream>
using namespace std;
#define OK 1
#define ERROR 0
#define MAXSIZE 6
typedef int ElemType;
typedef int Status;

/* 定义顺序存储结构的循环队列:SqQueue(循环队列防止假溢出)
 * 思路:
 * 1、用数组实现
 * 2、头指针front指向队头元素的下标
 * 3、尾指针rear指向队尾元素下一个位置的下标
 */
typedef struct
{
	ElemType data[MAXSIZE];
	int front;
	int rear;
}SqQueue;

/* 循环队列的初始化:InitQueue
 * 思路:
 * 1、头指针和尾指针指向的下标位置均为0
 */
Status InitQueue(SqQueue *Q)
{
	Q->front = 0;
	Q->rear = 0;
	return 0;
}

/* 循环队列求队列长度:Queuelength
 * 思路:
 * 1、队列满的条件是:(rear+1)%MAXSIZE==front
 * 2、规定:数组中只有一个空闲单元时3,规定已满
 * 3、当rear>front时,长度为:rear-front,
 * 4、当rear<front时,长度为:rear-front+MAXSIZE
 * 5、将3和4结合:长度为:(rear-front+MAXSIZE)%MAXSIZE
 */
int Queuelength(SqQueue Q)
{
	return (Q.rear - Q.front + MAXSIZE) % MAXSIZE;
}

/* 循环队列的入队,只在队尾入队:EnQueue,入队元素为e
 * 思路:
 * 1、判断队列是否已满,队列满的条件是:(rear+1)%MAXSIZE==front
 * 2、在队尾的下一个元素入队,即data[rear]=e;
 * 3、将尾指针后移一位i,若在最后择移动到数组头部,即:rear=(rear+1)%MAXSIZE
 */
Status EnQueue(SqQueue *Q, ElemType e)
{
	if ((Q->rear + 1) % MAXSIZE == Q->front)
	{
		cout << "队列已满" << endl;
		return ERROR;
	}
	Q->data[Q->rear] = e;
	Q->rear = (Q->rear + 1) % MAXSIZE;
	return OK;
}

/* 循环队列的出队:只在队头出队:DeQueue,返回元素为e
 * 思路:
 * 1、判断队列是否空,空的条件是front==rear
 * 2、将队头元素返回e:e=data[front];
 * 3、将头指针front后移一位,若到数组最后则移到数组头部,即:front=(front+1)%MAXSIZE
 */
Status DeQueue(SqQueue *Q, ElemType *e)
{
	if (Q->rear == Q->front)
	{
		cout << "队列已空" << endl;
		return ERROR;
	}
	*e = Q->data[Q->front];
	Q->front = (Q->front + 1) % MAXSIZE;
	return OK;
}

/* 输出队列函数:PrinftQueue
 * 思路:
 * 1、判断队列是否为空
 * 2、由于数组中始终有一个空闲单元,所以front!=rear
 * 3、当rear>front时,按下标从front到rear-1输出
 * 4、当rear<front时,先输出front到MAXSIZE-1,再输出0到rear-1
 */
Status PrinftQueue(SqQueue *Q)
{
	int i;
	if (Q->rear == Q->front)
	{
		cout << "队列已空" << endl;
		return ERROR;
	}
	if (Q->rear > Q->front)
	{
		for (i = Q->front; i < Q->rear; i++)
		{
			cout << Q->data[i] << ' ';
		}
	}
	else
	{
		for (i = Q->front; i < MAXSIZE; i++)
		{
			cout << Q->data[i] << ' ';
		}
		for (i = 0; i < Q->rear ; i++)
		{
			cout << Q->data[i] << ' ';
		}
	}
	return OK;
}

int main()
{
	SqQueue Q;
	InitQueue(&Q);
	int i,j,k,l,m,n;

	cout << "队列最大长度:" << MAXSIZE-1 << endl;

	cout << "输入入队元素个数:";
	cin >> i;
	cout << "依次入队元素:";
	for (j = 0; j < i; j++)
	{
		cin >> k;
		EnQueue(&Q, k);
	}

	cout << "输出队列:";
	PrinftQueue(&Q);
	cout << endl;

	int length;
	cout << "输出队列长度:";
	length = Queuelength(Q);
	cout << length << endl;

	cout << "输入出队元素个数:";
	cin >> l;
	cout << "输出出队元素:";
	for (j = 0; j < l; j++)
	{
		DeQueue(&Q, &m);
		cout << m << ' ';
	}
	cout << endl;

	cout << "输出队列:";
	PrinftQueue(&Q);
	cout << endl;

	cout << "输出队列长度:";
	length = Queuelength(Q);
	cout << length << endl;

	cout << "输入入队元素个数:";
	cin >> n;
	cout << "依次入队元素:";
	for (j = 0; j < n; j++)
	{
		cin >> k;
		EnQueue(&Q, k);
	}

	cout << "输出队列:";
	PrinftQueue(&Q);
	cout << endl;

	cout << "输出队列长度:";
	length = Queuelength(Q);
	cout << length << endl;


	return 0;


}

结果为:
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
顺序循环队列是一种使用顺序存储结构实现的队列。它通过将队列的首尾相连,构成一个循环结构,解决了普通队列在出队操作时需要移动元素的问题,提高了算法效率。[2] 顺序循环队列结构定义如下: ```c #define SIZE 8 typedef struct Queue { int elem[SIZE]; // 存放队列元素 int front; // 队头 int rear; // 队尾 } Queue, *QueueS; ``` 其中,`elem`数组用于存放队列元素,`front`表示队头的位置,`rear`表示队尾的位置。当队列为空时,`front`和`rear`的值相等;当队列满时,`rear`的下一个位置就是`front`。通过这种方式,可以实现循环利用队列存储空间。 顺序循环队列的操作包括入队和出队操作。入队操作将元素插入到队尾,同时更新`rear`的位置;出队操作将队头元素删除,同时更新`front`的位置。当队列满时,无法进行入队操作;当队列为空时,无法进行出队操作。因此,需要额外的判断条件来判断队列是否满或为空。 顺序循环队列的实现可以通过取模运算来实现循环的效果,即在计算`rear`和`front`的位置时,使用`(rear + 1) % SIZE`和`(front + 1) % SIZE`来计算新的位置。 总结来说,顺序循环队列是一种通过循环利用队列存储空间来提高算法效率的数据结构。它使用顺序存储结构实现,通过将队列的首尾相连构成循环结构,解决了普通队列在出队操作时需要移动元素的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CSU_hhxyliang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值