队列是一种先进先出的线性表,只能在表头删除在表尾插入,操作系统中的作业排队就是队列的一个很好的应用。也有可以在两端均可进行插入和删除操作的队列,称为双端队列,但其用处并没有一般队列广泛。
队列类型的实现
1:链队列——链式映象:
2:循环队列——顺序映象
第一部分:链队列——链式映象
算法1:队列的数据结构
typedefstruct QNode {// 结点类型
QElemType data;
struct QNode *next;
} QNode, *QueuePtr;
typedefstruct { // 链队列类型
QueuePtr front; // 队头指针
QueuePtr rear; // 队尾指针
} LinkQueue
空队列的判断条件是:Q.front==Q.rear
算法2:InitQueue(&Q):操作结果:构造一个空队列Q。
StatusInitQueue (LinkQueue &Q) {
// 构造一个空队列Q
Q.front = Q.rear=(QueuePtr)malloc(sizeof(QNode));
if (!Q.front) exit (OVERFLOW);
Q.front->next = NULL;
return OK;}
算法3:为队列插入元素为新的队尾元素
StatusEnQueue (LinkQueue &Q, QElemType e)
{ // 插入元素e为Q的新的队尾元素
p = (QueuePtr) malloc (sizeof (QNode));
if (!p) exit (OVERFLOW);
p->data = e; p->next = NULL;
Q.rear->next = p; Q.rear = p;
return OK;}
算法4:DeQueue(&Q, &e) 操作结果:删除Q的队头元素,并用e返回其值。
初始条件:Q为非空队列。
Status DeQueue (LinkQueue &Q,QElemType &e)
{// 若队列不空,则删除Q的队头元素,
//用 e 返回其值,并返回OK;否则返回ERROR
if (Q.front == Q.rear) returnERROR;
p = Q.front->next; e = p->data;
Q.front->next = p->next;
if (Q.rear = = p) Q.rear =Q.front;
free (p); return OK;
第二部分:循环队列——顺序映象
(1)用一组地址连续的存储单元依次存放从队头到队尾的元素,同时附设两个指针front 和rear分别指示队头元素和队尾元素的位置。
(2)当队列为空时:front=rear=0
(3)当插入元素时:队尾指针增加1;
(4)当删除元素时:队头指针增加1;
(5)因此:队头指针始终指向队头元素;而队尾指针始终指向队尾元素的下一位置。
算法1:队列的数据结构
#define MAXQSIZE 100 //最大队列长度
typedef struct {
QElemType *base; // 动态分配存储空间
int front; // 头指针,若队列不空,
// 指向队列头元素
int rear; // 尾指针,若队列不空,指向
// 队列尾元素 的下一个位置
} SqQueue
判断队满的方法:
1、设一个标志位;
2、浪费一个元素空间,约定队列头指针在队尾指针的下一位置时,表示队列满即:
(Q.rear+1) % MAXQSIZE = = Q.front是队满的判断条件
(Q.rear+1) mod maxsize=Q.front
算法2:创造一个新的队列
Status InitQueue (SqQueue &Q)
{ // 构造一个空队列Q
Q.base = (ElemType *) malloc(MAXQSIZE *sizeof (ElemType));
if (!Q.base) exit (OVERFLOW); // 存储分配失败
Q.front = Q.rear = 0; //队空的条件即
return OK; (Q.front ==Q.rear )
}
算法3:队列插入元素
Status EnQueue (SqQueue&Q, ElemType e)
{ // 插入元素e为Q的新的队尾元素
if ((Q.rear+1) % MAXQSIZE = = Q.front)
return ERROR; //队列满
Q.base[Q.rear] = e;
Q.rear = (Q.rear+1) % MAXQSIZE;
return OK;
}
算法4:队列插入删除元素
Status DeQueue (SqQueue &Q,ElemType &e)
{ // 若队列不空,则删除Q的队头元素,
// 用e返回其值,并返回OK; 否则返回ERROR
if (Q.front == Q.rear) return ERROR;
e = Q.base[Q.front];
Q.front = (Q.front+1) % MAXQSIZE;
return OK;
}