数据结构之循环队列(顺序队列)的实现(C语言)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_40411915/article/details/82725953

学习参考: 严蔚敏: 《数据结构-C语言版》

基本操作

  1. 入队
  2. 出队
  3. 建空队列
  4. 判队空
  5. 队满
  6. 获取队首元素

代码实现

队列结构定义

#define QUEUESIZE 100
typedef struct 
{
	char data[QUEUESIZE];
	int front;
	int rear;
	int len;
}SeqQueue,* pQueue;

建空队列

void initQueue(pQueue q)
{
	q->front = q->rear = 0;
	q->len = 0;
}

判队空

int queueEmpty(pQueue q)
{
	return q->len == 0;
}

队满

int queueFull(pQueue q)
{
	return q->len == QUEUESIZE;
}

入队

int enQueue(pQueue q, char c)
{
	if(queueFull(q))
		return 0;
	q->data[q->rear]=c;
	q->len++;
	q->rear = (q->rear+1)%QUEUESIZE;
	return 1;
}

出队

int deQueue(pQueue q, char* c)
{
	if(queueEmpty(q))
		return 0;
	*c = q->data[q->front];
	q->front = (q->front+1)%QUEUESIZE;
	q->len--;
	return 1;
}

获取队首元素

int getFront(pQueue q, char* c)
{
	if(queueEmpty(q))
		return 0;
	*c = q->data[q->front];
	return 1;
}

测试代码

#include <stdio.h>
#include "SeqQueue.h"
int main()
{
	SeqQueue q;
	char i = 'a', val = 0;
	initQueue(&q);
	for(i= 'A'; i<'z'; ++i)
		enQueue(&q, i);
	deQueue(&q, &val);
	printf("%c... \n", val);
	getFront(&q, &val);
	printf("%c... \n", val);
	return 0;
}

重要知识

       队空和队满时头尾指针均相等。因此,我们无法通过front=rear来判断队列“空”还是“满”

解决此问题的方法至少有三种:

  1. 另设一个布尔变量以匹别队列的空和满
  2. 少用一个元素的空间,约定入队前,测试尾指针在循环意义下加1后是否等于头指针,若相等则认为队满(注意:rear所指的单元始终为空);
  3. 使用一个计数器记录队列中元素的总数(实际上是队列长度)。

写在最后

文章记录本人学习所得, 如有所错误, 欢迎留言指出交流, 大神请键盘下留人 ! ! ! ​​​​​​​

猜你喜欢

转载自blog.csdn.net/weixin_40411915/article/details/82725953