版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_40411915/article/details/82725953
学习参考: 严蔚敏: 《数据结构-C语言版》
基本操作
- 入队
- 出队
- 建空队列
- 判队空
- 队满
- 获取队首元素
代码实现
队列结构定义
#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后是否等于头指针,若相等则认为队满(注意:rear所指的单元始终为空);
- 使用一个计数器记录队列中元素的总数(实际上是队列长度)。
写在最后
文章记录本人学习所得, 如有所错误, 欢迎留言指出交流, 大神请键盘下留人 ! ! !