顺序循环队列

#include<stdio.h>

#define QUEUESIZE 60
typedef char DataType;

typedef struct Squeue
{
	DataType queue[QUEUESIZE];
	int front, rear;
	int tag;     //队列空满的标志
}SCQueue;

/*顺序循环队列初始化*/
void InitQueue(SCQueue *SCQ)
{
	SCQ->front = SCQ->rear = 0;
	SCQ->tag = 0;
}

/*判断队列是否为空*/
int QueueEmpty(SCQueue SCQ)
{
	if (SCQ.front == SCQ.rear && SCQ.tag==0)
		/*队头队尾指针都为0且标志位为0,表示队列已空*/
		return 1;
	else
		return 0;
}

/*入队操作*/
int EnQueue(SCQueue *SCQ, DataType e)
{
	if (SCQ->rear == SCQ->front && SCQ->tag == 1)
		/*入队之前,判断队尾指针是否达到数组的最大值,即是否上溢*/
	{
		printf("顺序队列已满,不能入队!");
		return 0;
	}
	else
	{
		SCQ->queue[SCQ->rear] = e;   //在队尾插入元素e
		SCQ->rear = SCQ->rear + 1;   //队尾指针向后移动一个单位
		SCQ->tag = 1;                //入队成功,标志位为1
		return 1;
	}
}

/*出队操作*/
int DeQueue(SCQueue *SCQ, DataType *e)
{
	if (QueueEmpty(*SCQ))
	{
		printf("顺序队列已空,不能出队!");
		return 0;
	}
	else
	{
		*e = SCQ->queue[SCQ->front];	 //将要删除的元素赋值给e
		SCQ->front = SCQ->front + 1;   //队头指针向后移动一个单位
		SCQ->tag = 0;                   //删除成功标志位为0
		return 1;
	}
}

/*输出队列*/
void DisplayQueue(SCQueue SCQ)
{
	int i;
	if (QueueEmpty(SCQ))
		return;

	if (SCQ.front < SCQ.rear)
		   //如果队头指针小于队尾指针,则把队头指针到队尾指针指向的元素依次输出
	{
		for (i = SCQ.front; i <= SCQ.rear; i++)
			printf("%c", SCQ.queue[i]);
	}
	else   //如果队头指针大于队尾指针,则把队尾指针到队头指针指向的元素依次输出
	{
		for (i = SCQ.front; i <= SCQ.rear+QUEUESIZE; i++)
			printf("%c", SCQ.queue[i%QUEUESIZE]);
	}
	printf("\n");
}

void main()
{
	SCQueue Q;
	char e;     //用于存放出队列的元素
	InitQueue(&Q);
	printf("A入队\n");
	EnQueue(&Q, 'A');
	printf("B入队\n");
	EnQueue(&Q, 'B');
	printf("C入队\n");
	EnQueue(&Q, 'C');

	printf("队列中的元素:");
	DisplayQueue(Q);

	printf("队头元素第一次出队\n");
	DeQueue(&Q, &e);
	printf("出队的元素:");
	printf("%c\n", e);

	printf("队头元素第二次出队\n");
	DeQueue(&Q, &e);
	printf("出队的元素:");
	printf("%c\n", e);

	printf("队列中的元素:");
	DisplayQueue(Q);

	printf("D入队\n");
	EnQueue(&Q, 'D');
	printf("E入队\n");
	EnQueue(&Q, 'E');
	printf("F入队\n");
	EnQueue(&Q, 'F');

	printf("队列中的元素:");
	DisplayQueue(Q);
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值