数据结构.队列

一、定义

队列(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 }
View Code

三、队列的应用

1.CPU资源的竞争问题。在具有多个终端的计算机系统中,有多个用户需要使用CPU各自运行自己的程序,它们分别通过各自终端向操作系统提出使用CPU的请求,操作系统按照每个请求在时间上的先后顺序,将其排成一个队列,每次把CPU分配给队头用户使用,当相应的程序运行结束,则令其出队,再把CPU分配给新的队头用户,直到所有用户任务处理完毕。

2.主机与外部设备之间速度不匹配的问题。以主机和打印机为例来说明,主机输出数据给打印机打印,主机输出数据的速度比打印机打印的速度要快得多,若直接把输出的数据送给打印机打印,由于速度不匹配,显然是不行的。所以解决的方法是设置一个打印数据缓冲区,主机把要打印输出的数据依此写如到这个缓冲区中,写满后就暂停输出,继而去做其它的事情,打印机就从缓冲区中按照先进先出的原则依次取出数据并打印,打印完后再向主机发出请求,主机接到请求后再向缓冲区写入打印数据,这样利用队列既保证了打印数据的正确,又使主机提高了效率。

posted @ 2015-03-06 13:30  J·A  阅读(248)  评论(0编辑  收藏  举报