队列:
1、在一端插入在另一端删除
2、先进先出 (First In First Out,FIFO)
3、允许插入的一端为队尾,允许删除的一端为队头
循环队列:
对于普通的顺序队列判空条件是front是否与rear相等且等于0,但出对时会出现向上溢出现象,这种溢出并不是真正的溢出,在数组中依然存在可以存放元素的空位置,所以是一种假溢出现象,为了解决这种现象我们可以把顺序队列想象成环状,当对首指针front = MAX_SIZE - 1后在前进一次就到0(对MAX_SIZE取余运算来实现)。
初始化:front = rear = 0;
入 队:rear = (rear + 1) % MAX_SIZE;
出 对:front = (front + 1) % MAX_SIZE;
对 长:(rear - front + MAX_SIZE) % MAX_SIZE;
但是这就有一个问题,队空与队满的判断条件都是front = rear,我们为了区分队空与队满我们可以专门用一个单元空间来判断(还有其他方法),既队头指针在队尾指针的下一个位置就代表队满。
队 满:(rear+ 1)% MAX_SIZE == front;
队 空:front == rear;

sqqueue.h
#ifndef SQQUEUE_H
#define SQQUEUE_H
#include <stdio.h>
#include <string.h>
#define MAX_SIZE 128
typedef struct
{
char data[MAX_SIZE];
int front; //头
int rear; //尾
}Sqqueue;
void Init_Queue(Sqqueue * queue);
int Queue_Empty(Sqqueue queue);
int Queue_Length(Sqqueue * queue);
int Push(Sqqueue * queue,char ch);
int Pop(Sqqueue * queue,char *ch);
#endifsqqueue.c
#include "sqqueue.h"
//初始化队列
void Init_Queue(Sqqueue * queue)
{
queue->front = 0;
queue->rear = 0;
memset(queue,0,sizeof(queue->data));
}
//判空
int Queue_Empty(Sqqueue queue)
{
return (queue.rear == queue.front ? 1 : 0); //空返回1
}
//求队列长度
int Queue_Length(Sqqueue * queue)
{
return((queue->rear - queue->front + MAX_SIZE) % MAX_SIZE);
}
//入队
//入队成功返回1
int Push(Sqqueue * queue,char ch)
{
if((queue->rear + 1) % MAX_SIZE == queue->front)
return 0;
queue->data[queue->rear] = ch;
queue->rear = (queue->rear + 1) % MAX_SIZE;
return 1;
}
//出队
int Pop(Sqqueue * queue,char *ch)
{
if(queue->front == queue->rear)
return 0;
*ch = queue->data[queue->front];
queue->front = (queue->front + 1) % MAX_SIZE;
return 1;
}
main.c
#include "sqqueue.h"
Sqqueue * queue;
Sqqueue qu;
int main(void)
{
int i;
char ch;
queue = &qu;
Init_Queue(queue);
printf("队列长度是:%d\n",Queue_Length(queue));
if(Queue_Empty(*queue))
printf("空队列\n");
printf("请往队列里添加10个内容:\n");
for(i = 0;i < 10;i++)
{
Push(queue,getchar());
}
while(!Queue_Empty(*queue))
{
if(Pop(queue,&ch))
printf("出对数据是:%c\n",ch);
printf("队列长度是:%d\n",Queue_Length(queue));
}
return 0;
}
本文介绍了一种解决顺序队列假溢出问题的方法——循环队列,并详细讲解了其核心概念、初始化过程、基本操作如入队、出队及队列状态判断等。通过示例代码展示了如何在实际编程中运用循环队列。
3008

被折叠的 条评论
为什么被折叠?



