队列的相关实现

来源:互联网 发布:诺亚网络萝卜街 编辑:程序博客网 时间:2024/05/21 22:37

1.队列的链式实现方式


代码如下:

typedef int Datatype;typedef struct Quene//定义一个结点{Datatype data;struct Quene* next;}Quenu,*Quenuptr;typedef struct Linkquenu{Quenuptr front, rear;//指向头结点和尾部的指针int count;//计数器记录有多少个元素}Linkquenu;void Initquene(Linkquenu *L)//初始化队列,创建一个头结点{L->front = L->rear = (Quenuptr)malloc(sizeof(Quenu));L->count = 0;}void Insertquene(Linkquenu *L, Datatype e){Quenuptr p = (Quenuptr)malloc(sizeof(Quenu));//开辟第一个结点p->data = e;//将数据插入L->rear->next =p;//头结点指向第一个结点L->rear = p;//指向最后一个结点p->next = NULL;L->count++;}void popelem(Linkquenu *L, Datatype *e)//出队列操作{if (L->front == L->rear)//没有元素{return;}Quenuptr p = L->front->next;//记录第一个结点的值L->front->next = p->next;//第二个结点给头结点,如果只有一个结点此时将front置空了所以下面要进行判断*e =p->data;//赋值if (L->rear == p)//如果只有一个结点的话{L->rear = L->front;//将rear也置空}free(p);//释放第一个结点}int  Getelem(Linkquenu *L)//获取队列元素{return L->count;}void DestroyQ(Linkquenu *L)//销毁队列{while (L->front){L->rear = L->front->next;//把第一个结点的位置记下来free(L->front);L->front = L->rear;//L->front指向第一个结点}}int main(){Linkquenu link;Initquene(&link);for (int i = 0; i < 10; i++){Insertquene(&link, i+1);}int len = Getelem(&link);int e;for (int i = 0; i < len; i++){popelem(&link, &e);printf("%d ",e);}system("pause");return 0;}


2.循环队列

因为顺序栈很容易出现假溢出的现象,所以就有了循环队列




代码如下:

#include<stdio.h>#include<malloc.h>#include<stdlib.h>#include<math.h>#define MAX 10typedef int Datatype;typedef struct circleQ{Datatype *data;int front;int rear;}circleQ,*circleQptr;void InitcircleQ(circleQptr s)//初始化队列{s->data = (Datatype *)malloc(sizeof(Datatype)*MAX);//申请空间if (s->data == NULL)return;else{s->front = 0;s->rear = 0;}}void Pushelem(circleQptr s, Datatype e){if ((s->rear + 1 )% MAX== s->front)//判断队列是否满了{return;}s->data[s->rear] = e;//赋值s->rear = (s->rear + 1) % MAX;}void Popelem(circleQptr s, Datatype *e)//弹出元素{if (s->front% MAX == s->rear)//队列已经满了{return;}else{*e = s->data[s->front];s->front = (s->front + 1) % MAX;}}int Getcount(circleQptr s)//或者{return (int)fabs(s->front - s->rear);}int main(){circleQ QQ;InitcircleQ(&QQ);Pushelem(&QQ,1);Pushelem(&QQ, 2);Pushelem(&QQ, 3);Pushelem(&QQ, 4);int len = Getcount(&QQ);for (int i = 0; i <10; i++){int e;if (Popelem(&QQ, &e)==0){break;}printf("%d ", e);}system("pause");return 0;}


原创粉丝点击