首页 > 代码库 > 队列表示与实现
队列表示与实现
队列是一种先进先出(FIFO)的线性表,他只允许在表的一端进行插入,而在另一端删除元素。在队列中,允许插入的一端叫做队尾(rear),允许删除的一端则称为对头(front)。
链队列——队列的链式表示和实现
用链表表示的队列简称链队列。一个链队列显然需要两个分别指示对头和队尾的指针才能唯一确定。空的链队列的判决条件为头指针和尾指针均指向头结点。链队列的操作即为单链表的插入和删除操作的特殊情况,只是尚需修改尾指针或头指针。
typedef struct QNode { int data; struct QNode *next; }QNode,*QueuePtr; typedef struct { QueuePtr front; QueuePtr rear; }LinkQueue; //队列初始化 void QueueInit(LinkQueue &Q) { Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode)); if(!Q.front) exit(0); Q.front->next=NULL; } void Destroy(LinkQueue &Q) { while(Q.front) { Q.rear=Q.front->next; free(Q.front); Q.front=Q.rear; } } //判断队列是否为空:为空返回1,不为空返回0 int IsEmpty(LinkQueue Q) { if(Q.front==Q.rear) return 1; return 0; } //返回队列的头元素 int GetHear(LinkQueue Q,int &e) { if(Q.front==Q.rear) { cout << "The queue is empty!" << endl; exit(1); } return Q.front->data; } //入队 void EnQueue(LinkQueue &Q,int e) { QNode *p=(QueuePtr)malloc(sizeof(QNode)); if(!p) exit(0); p->data=http://www.mamicode.com/e; p->next=NULL; Q.rear->next=p; Q.rear=p; } //出队 void Dequeue(LinkQueue &Q,int &e) { if(Q.front==Q.rear) exit(0); QNode *p; p=Q.front->next; e=p->data; Q.front->next=p->next; if(Q.rear==p) Q.rear=Q.front; free(p); }
循环队列——队列的顺序表示和实现
初始化队列时,令front=rear=0,每当插入新的队列尾元素时,“尾指针增1”;每当删除队列头元素时,“头指针增1”。因此,在非空队列中,头指针始终指向队列头元素,而尾指针始终指向队列尾元素的下一个位置。当什么时候队列满呢?当rear等于front的时候。可是队列为空的时候也是同样的条件,那不就没法判断了吗?又有人提出了这样的想法:牺牲一个存储空间,front前面不存数据,当rear在front前面的时候就是满了。
满的判断条件应为:(rear+1)%LENGTH == front 。空的判断条件为 rear == front。
#define MAXSIZE 100 typedef struct { int *base; int front; int rear; }SqQueue; void InitQueue(SqQueue &Q) { Q.base=(int *)malloc(MAXSIZE*sizeof(int)); if(!Q.base) exit(0); Q.front=Q.rear=0; } int QueueLength(SqQueue Q) { return (Q.rear-Q.front+MAXSIZE)%MAXSIZE; } void EnQueue(SqQueue &Q,int e) { if((Q.rear+1)%MAXSIZE==Q.front) exit(0); Q.base[Q.rear]=e; Q.rear=(Q.rear+1)%MAXSIZE; } void DeQueue(SqQueue &Q,int &e) { if(Q.rear==Q.front) exit(0); e=Q.base[Q.front]; Q.front=(Q.front+1)%MAXSIZE; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。