一、队列是什么
队列是一种可以实现“先进先出”的存储结构。其实,说简单点,队列就是排队,跟我们日常生活中到银行取钱排队,排队打饭在道理上是一样的。
队列通常可以分为两种类型:
①链式队列(由链表实现)。
②静态队列(由数组实现),静态队列通常都必须是循环队列。
由于链式队列跟链表差不多,所以在这里只针对循环队列来说明并实践。
循环队列的两个参数:
①front,front指向队列的第一个元素。
②rear,rear指向队列的最后一个有效元素的下一元素。
队列的两个基本操作:出队和入队。
二、队列的结构
下面是一个循环队列(基于数组实现)的结构图:
三、队列的操作
入队(尾部入队)
①将值存入rear所代表的位置。
②rear = (rear+1)%数组的长度。
出队(头部出队)
front = (front+1)%数组的长度。
队列是否为空
front和rear的值相等,则该队列就一定为空。
队列是否已满
注意:循环队列中,有n个位置,通常放n-1个值,空1个
在循环队列中,front和rear指向的值不相关,无规律。front可能比rear指向的值大,也可能比rear指向的值小,也可能两者相等。
算法:
①多增加一个标识参数。
②少用一个元素,rear和front指向的值紧挨着,则队列已满。
四、队列的实现
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct student_grade
{
char name[20];
char score;
} Student;
#define QueueLen 10
//Student StudentBuf[QueueLen]={0};
/*
char rear=0;
char front=0;
*/
#define Fail 1
#define Success 0
#define true 1
#define false 0
#define ToString(a) #a
typedef struct Queue
{
Student * pBase; //用于动态分配内存,pBase保存数组的首地址
int front; //头结点
int rear; //下一个队列节点
int len; //队列长度
} QUEUE;
QUEUE queue;
char IS_Empty(void)
{
if(queue.rear==queue.front)
{
printf("queue is empty\n");
return true;
}
else
{
return false;
}
}
char IS_Full(void)
{
/***
加一是为了避免初始化的时候, front和rear都为0,计算出
队列为满,但是少存储个队列。
***/
if((queue.rear+1)%QueueLen==queue.front)
{
printf("queue is full\n");
return true;
}
else
{
return false;
}
}
char inQueue(Student *value)
{
if(IS_Full()==true)
{
return Fail;
}
memcpy(queue.pBase[queue.rear].name, value->name,20);
queue.pBase[queue.rear].score=value->score;
queue.rear=(queue.rear+1)%QueueLen;
//printf("rear=%d\n",queue.rear);
return Success;
}
char outQueue(Student *value)
{
if(IS_Empty()==true)
{
return Fail;
}
memcpy(value->name,queue.pBase[queue.front].name,20);
value->score=queue.pBase[queue.front].score;
queue.front=(queue.front+1)%QueueLen;
//printf("front=%d\n",queue.front);
return Success;
}
void initQueue(QUEUE * pQueue)
{
//分配内存
pQueue->pBase = (Student *)malloc(sizeof(Student)*QueueLen);
pQueue->front = 0;
pQueue->rear = 0;
pQueue->len = QueueLen;
return;
}
void deinitQueue(QUEUE * pQueue)
{
free(pQueue->pBase);
}
int main(void)
{
int i=0;
Student newstudent={0,0};
initQueue(&queue);
for(i=0;i<queue.len;i++)
{
sprintf(newstudent.name,"%c",'a'+i);
newstudent.name[1]=0;
newstudent.score=i;
/*
名字和分数依次是 a 0
b 1
c 2
d 3
*/
printf("-%s- ",newstudent.name);
if(inQueue(&newstudent)==Fail)
{
break;
}
}
printf("\n----\n");
for(i=0;i<queue.len;i++)
{
if(outQueue(&newstudent)==Fail)
{
break;
}
else
{
printf("[--%s-%d-] ",newstudent.name,newstudent.score);
}
}
printf("\n----\n");
deinitQueue(&queue);
return 0;
}