愚 公

每一个努力的人,都有一段沉默的时光。那一段时光,是付出了很多努力,忍受孤独和寂寞,不抱怨不诉苦,日后说起时,连自己都能被感动的日子。...

数据结构-队列

队列(FIFO

一种特殊的线性表,限定在队头删除在队尾插入。

-


ADT Queue{

数据对象:D={ai|aiELemSet,i=1,2,…n,n>=0}

数据关系:R={<ai-1,ai>|ai-1,aiD,i=2,…n}

基本操作:

InitQueue(&Q);     //构造一个空队列

DestroyQueue(&Q);  //销毁队列

ClearQueue(&Q);   //将队列清空

QueueEmpty(Q);   //判断队列是否为空队列

QueueLength(Q);    //返回队列的长度

GetHead(Q,&e);   //返回队头元素

EnQueue(&Q,e);   //在队尾插入新元素

DeQueue(&Q,&e);   //删除队首元素

}//ADT Queue

-实现

-队列的链式表示

typedef struct QNode{

QElemType data;

struct QNode *next;

}QNode,*QueuePtr;

typedef struct{

QueuePtr front;

QueuePtr rear;

}LinkQueue;


-初始化队列

status InitQueue(LinkQueue &Q){

Q.front=Q.rear=new QNode;

if(!Q.front) return ERROR;

Q.front->next=null;

return Ok;

}//InitQueue


-入队

status EnQueue(LinkQueue &Q,QElemType e){

p=new QNode;

if(!p) return ERROR;

if(Q.front==Q.rear) Q.front->next=p;

p->data=e;p->next=null;

Q.rear->next=P;

Q.rear=p;

return Ok;

}//EnQueue


-出队

status DeQueue(LinkQueue &Q,QElemType &e){

if(Q.front==Q.rear) return ERROR;

p=Q.front->next;

e=p->data;

Q.front->next=p->next;

if(Q.rear==p) Q.rear=Q.front;

free(p);

return Ok;

}//DeQueue


-队列的顺序表示

-假溢出:当元素被插入到数组中下标最大的位置上之后,尽管此时数组的低端还有空闲空间,但不能再有入队操作了,这种现象叫做假溢出。

-循环队列:将存储队列的数组头尾相接。用求mod的方式确定位置。

-队空:front=rear;   队满(修改版):浪费一个元素空间(rear+1%MaxSize==front;使用计数器;设置一个bool变量。

       -循环队列中的元素个数的计算:当rear>=front,rear-front;当rear<front,rear-front+队列容量;

                                                   或使用公式   L=(容量+rear-front)%容量

约定rear指向队尾元素的后一位置,front指向队头元素。

const MAXQUEUE=100;

typedef struct{

QELemType Data[MAXQUEUE];

int front,rear;

}Queue;

      

阅读更多
版权声明:只为学习之用,有不对的地方请告诉我,谢谢! https://blog.csdn.net/darkxiaoming/article/details/79950313
个人分类: 数据结构
上一篇MySQL-基础SQL执行语句
下一篇算法设计-利用栈判别表达式中的括弧是否配对
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭