数据结构.队列
一、定义
队列(Queue)是只允许在一端进行插入,而在另一端进行删除的运算受限的线性表。
二、基本概念
1.允许删除的一端称为队头(Front)。
2.允许插入的一端称为队尾(Rear)。
3.当队列中没有元素时称为空队列。
4.队列亦称作先进先出(First In First Out)的线性表,简称为FIFO表。
队列的修改是依先进先出的原则进行的。新来的成员总是加入队尾(即不允许"加塞"),每次
离开的成员总是队列头上的(不允许中途离队),即当前"最老的"成员离队
1 ///Name:Queue 2 ///Author:JA 3 ///Date:2015-3-6 4 5 6 7 ///单链队列——队列的链式存储结构 8 typedef struct QNode{ 9 QElemType data; 10 struct QNode *next; 11 12 }QNode, *QueuePtr; 13 typedef struct{ 14 Queue front; //队头指针 15 Queue rear; //队尾指针 16 }LinkQueue; 17 18 ///基本操作的算法部分 19 Status InitQueue(LinkQueue *Q){ 20 //构造一个空队列Q 21 Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode)); 22 if (!Q.front) exit(OVERFLOW); 23 Q.front->next = NULL; 24 return OK; 25 } 26 27 Status DestroyQueue(LinkQueue *Q){ 28 //销毁队列 29 while (Q.front){ 30 Q.rear = Q.front->next; 31 free(Q.front); 32 Q.front = Q.rear; 33 } 34 return OK; 35 } 36 37 Status EnQueue(LinkQueue *Q,QElemType e){ 38 //插入元素e为新的队尾元素 39 p=(QueuePtr)malloc(sizeof(QNode)); 40 if (!p)exit(OVERFLOW); 41 p->data = e; p->next = NULL; 42 Q.rear->next = p; 43 Q.rear = p; 44 return OK; 45 } 46 47 Status DeQueue(LinkQueue *Q,QElemType &e){ 48 //若队列不为空,则删除Q的队头元素,用e返回其值,并返回OK 49 //否则返回ERROR 50 if (Q.front = Q.rear) return ERROR; 51 p = Q.front->next; 52 e = p->data; 53 Q.front->next = p->next; 54 if (Q.rear == p) Q.rear = Q.front; 55 free(p); 56 return OK; 57 }
三、队列的应用
1.CPU资源的竞争问题。在具有多个终端的计算机系统中,有多个用户需要使用CPU各自运行自己的程序,它们分别通过各自终端向操作系统提出使用CPU的请求,操作系统按照每个请求在时间上的先后顺序,将其排成一个队列,每次把CPU分配给队头用户使用,当相应的程序运行结束,则令其出队,再把CPU分配给新的队头用户,直到所有用户任务处理完毕。
2.主机与外部设备之间速度不匹配的问题。以主机和打印机为例来说明,主机输出数据给打印机打印,主机输出数据的速度比打印机打印的速度要快得多,若直接把输出的数据送给打印机打印,由于速度不匹配,显然是不行的。所以解决的方法是设置一个打印数据缓冲区,主机把要打印输出的数据依此写如到这个缓冲区中,写满后就暂停输出,继而去做其它的事情,打印机就从缓冲区中按照先进先出的原则依次取出数据并打印,打印完后再向主机发出请求,主机接到请求后再向缓冲区写入打印数据,这样利用队列既保证了打印数据的正确,又使主机提高了效率。