C语言数据结构之顺序队列
tips:前些天学习了顺序表和顺序栈,今天来看看c语言数据结构之队列的基本操作。
队列的特点是先进先出,后进后出。因此我们使用一个队头指针和一个队尾指针分别指向队头元素,以及队尾元素的下一个位置。
首先我们创建一个顺序队列的结构体
#define MaxSize 10 //定义队列中最大元素个数
typedef struct {
int data[MaxSize];//用静态数组存放队列元素
int front, rear;//队头指针和队尾指针,这里队尾指针指向的是队尾元素的下一个位置
//针对这种队列设计方式:队列中元素的个数:(rear+MaxSize-front)%MaxSize,这会浪费一个存储空间
}Queue,*pQue;
准备顺序队列元素打印函数
//打印队列中的元素
void print_Queue(pQue q)
{
int head = q->front;
while (head != q->rear)
{
printf("%d\n", q->data[head]);
head++;
}
printf("---------------------------------\n");
}
1、队列的初始化(InitQueue)
//初始化队列
void InitQueue(pQue q)
{
//初始时,队头和队尾指针都指向0号下标
q->front = 0;
q->rear = 0;
}
2、入队(EnQueue)
思路:
- 当队列满时,不予入队,注意这里队满的判断条件;
- 当队列未满时,将元素入队,注意rear指针的移动;
具体实现:
//入队
void EnQueue(pQue q, int e)
{
if ((q->rear+1)%MaxSize==q->front)
{
printf("队满!\n");
}
else
{
q->data[q->rear] = e;
q->rear =(q->rear+1)%MaxSize;//队尾指针后移(转圈移动)
//rear始终指向队尾元素的下一个位置
}
}
3、出队(DeQueue)
思路:
- 当队空时(front==rear),不予出队;
- 当队非空时,front指针移动;
具体实现:
//出队
void DeQueue(pQue q)
{
if (q->front == q->rear)
{
printf("队空!\n");
}
else
{
q->front = (q->front + 1) % MaxSize;//front指针后移(转圈移动)
}
}
4、判断队列是否为空(QueueEmpty)
思路:
- 当front==rear,队列空,返回1;
- 当front!=rear,队列非空,返回0;
具体实现:
//判断队列是否为空
int QueueEmpty(pQue q)
{
if (q->front == q->rear)
{
return 1;
}
else
return 0;
}
到此,我们就完成了队列的基本操作,还是比较简单的!
我们可以在main()函数中测试一下:
int main()
{
Queue que;
pQue q = &que;
int val;
char panduan;//判断是否出队(y/n)
InitQueue(q);
//循环入队
while (scanf("%d", &val) != EOF)
{
//入队
EnQueue(q, val);
}
//打印队列元素
printf("队列中的元素为:\n");
print_Queue(q);
while (printf("是否出队?y/n:"), scanf("%c", &panduan) != NULL)
{
if (panduan == 'y')
{
//出队
DeQueue(q);
//打印元素
print_Queue(q);
//判断队列是否为空
if (QueueEmpty(q))
{
printf("队列为空!\n");
}
else
{
printf("队列不为空!\n");
}
printf("---------------------------------\n");
}
else if (panduan == 'n')
{
break;
}
}
return 0;
}
测试结果:
顺序队列的操作到此已经完成,希望对大家的学习有所帮助,加油!
没有太晚的开始,不如就从今天行动。总有一天,那个一点一点可见的未来,会在你心里,也在你的脚下慢慢清透。生活,从不亏待每一个努力向上的人。