队列

✍ dations ◷ 2025-11-03 18:46:23 #数据结构,抽象数据类型

队列,又称为伫列(queue),计算机科学中的一种抽象资料型别,是先进先出(FIFO, First-In-First-Out)的线性表。在具体应用中通常用链表或者数组来实现。队列只允许在后端(称为)进行插入操作,在前端(称为)进行删除操作。

队列的操作方式和堆栈类似,唯一的区别在于队列只允许新数据在后端进行添加。

单链队列使用链表作为基本数据结构,所以不存在伪溢出的问题,队列长度也没有限制。但插入和读取的时间代价较高

  1 // 定义单链队列的存储结构  2 typedef struct QNode {  3     int data;  4     QNode *next;  5 }QNode,*QNodePtr;  6   7 typedef struct LinkQueue{  8     //队头 队尾 指针  9     QNodePtr front,rear; 10 }LinkQueue; 11  12  13 // 构造一个空队列Q 14 LinkQueue* Q_Init() { 15     //申请内存 16     LinkQueue* Q = (LinkQueue*)malloc(sizeof(LinkQueue)); 17     //如果 Q 为 NULL 说明 内存申请失败,结束程序 18     if (!Q) 19         exit(OVERFLOW); 20     //初始化头尾节点 指向相同地址 21     Q->front = Q->rear = (QNodePtr)malloc(sizeof(QNode)); 22     //如果 Q->front 为 NULL 说明 内存申请失败,结束程序 23     if (!Q->front) 24         exit(OVERFLOW); 25     Q->front->next = NULL; 26     return Q; 27 } 28  29 // 销毁队列Q(无论空否均可) 30 void Q_Destroy(LinkQueue *Q) { 31     while (Q->front) { 32         //将队尾指向队头下一个节点的地址(第1个节点) 33         Q->rear = Q->front->next; 34         //回收队头 35         free(Q->front); 36         //将队头指向队尾(相当于第1个节点变成了队头,然后依次第2个第3个、、、 37         //直到没有下一个节点,也就是 Q->front == NULL 的时候) 38         Q->front = Q->rear; 39     } 40     free(Q); 41 } 42  43 // 将Q清为空队列 44 void Q_Clear(LinkQueue *Q) { 45     QNodePtr p, q; 46     //将队尾指向队头点的地址 47     Q->rear = Q->front; 48     //取出第1个节点 49     p = Q->front->next; 50     //回收第1个节点 51     Q->front->next = NULL; 52     while (p) { 53         //将 q 指向 p(第1个节点) 54         q = p; 55         //将 p 指向 第2个节点 56         p = p->next; 57         //回收第2个节点 58         free(q); 59     } 60 } 61  62 // 若Q为空队列,则返回-1,否则返回1 63 int Q_Empty(LinkQueue Q) { 64     if (Q.front->next == NULL) 65         return 1; 66     else 67         return -1; 68 } 69  70 // 求队列的长度 71 int Q_Length(LinkQueue Q) { 72     int i = 0; 73     QNodePtr p; 74     p = Q.front; 75     //遍历队列中的节点,直到队尾等于队头 76     while (Q.rear != p) { 77         i++; 78         p = p->next; 79     } 80     return i; 81 } 82  83 // 打印队列中的内容 84 void Q_Print(LinkQueue Q) { 85     int i = 0; 86     QNodePtr p; 87     p = Q.front; 88     while (Q.rear != p) { 89         i++; 90         cout << p->next->data << endl; 91         p = p->next; 92     } 93 } 94  95 // 若队列不空,则用e返回Q的队头元素,并返回1,否则返回-1 96 int Q_GetHead(LinkQueue Q, int &e) { 97     QNodePtr p; 98     if (Q.front == Q.rear) 99         return -1;100     p = Q.front->next;101     e = p->data;102     return 1;103 }104 105 // 插入元素e为Q的新的队尾元素106 void Q_Put(LinkQueue *Q, int e) {107     QNodePtr p = (QNodePtr)malloc(sizeof(QNode));108     if (!p) // 存储分配失败109         exit(OVERFLOW);110     p->data = e;111     p->next = NULL;112     //FIFO,将新节点追加到尾节点后面113     Q->rear->next = p;114     //将新的节点变成尾节点115     Q->rear = p;116 }117 118 119 // 若队列不空,删除Q的队头元素,用e返回其值,并返回1,否则返回-1120 int Q_Poll(LinkQueue *Q,int &e) {121     QNodePtr p;122     if (Q->front == Q->rear)123         return -1;124     //取出头节点125     p = Q->front->next;126     //取出头节点的数据127     e = p->data;128     cout << e << endl;129     Q->front->next = p->next;130     if (Q->rear == p)131         Q->rear = Q->front;132     free(p);133     cout << e << endl;134     return 1;135 }

循环队列

循环队列可以更简单防止伪溢出的发生,但队列大小是固定的。

相关

  • 糖蜜糖蜜(英语:molasses)是将甘蔗或甜菜制成食糖的加工过程中的副产品,一般是棕黑色黏稠液体。浓缩榨汁在分离出白糖后余下的都是糖蜜,因此含有比白糖丰富的营养物质。红糖是糖蜜没有
  • 梅达沃彼得·布赖恩·梅达沃爵士,OM,CBE,FRS(英语:Sir Peter Brian Medawar,1915年2月28日-1987年10月2日),出生于巴西里约热内卢的英国科学家,主要研究免疫学。他与弗兰克·麦克法兰·伯内
  • 寻常海绵纲见内文寻常海绵纲(学名:Demospongiae)是多孔动物门中最大的一纲,全世界大约有7000种以上;多数海产,仅少部分属于淡水种,大约150种;有些种类体型可以长到2米长。都是群体;呈块状。有
  • 斑龙巨齿龙属(属名:Megalosaurus,在希腊文中意为“巨大的蜥蜴”)又名巨龙、斑龙,是种大型肉食性恐龙,生存于侏罗纪中期巴通阶的欧洲(英格兰南部、法国、葡萄牙),约1亿6600万年前。巨齿龙
  • 造岩矿物造岩矿物是指组成岩石的矿物。它们大部分是硅酸盐及碳酸盐矿物,存在于火成岩中。常见造岩矿物包括石英,钾长石,斜长石,云母,角闪石,辉石和橄榄石。这七种矿物是地壳岩石的主要成分
  • 克里斯·华莱士克里斯托弗·“克里斯”·华莱士(英语:Christopher "Chris" Wallace,1947年10月12日-),是一位美国电视主持人和政治评论家。作为现今福克斯广播公司的主持人,现在主持着一档福克斯
  • 爱情小说 (韩影)《爱情小说》(韩语:러브픽션)是2012年上映的一部韩国剧情片。缺乏恋爱经验的小说家周月,在一个场合认识了电影公司职员熙珍,后通过各种手段努力使熙珍身为他的女人,后因种种原因不
  • 建楠路建楠路(Jiannan Rd.)为高雄市楠梓区的东西向主要市区道路。起端楠梓车站,沿途跨越楠梓溪,末端于楠梓路口,续行兴楠路接国道一号楠梓交流道和往大社区。本道路连结楠梓车站与国道
  • 阮祥云阮祥云(Nguyễn Tường Vân, 1980年8月17日-2005年12月2日),澳大利亚籍越南裔青年,出身于墨尔本,他涉嫌偷运毒品进入新加坡而于2005年底被判处死刑。阮祥云与一名双生兄弟(Dang K
  • 掠果蝠属掠果蝠属(掠果蝠),哺乳纲、翼手目、叶口蝠科的一属,而与掠果蝠属(掠果蝠)同科的动物尚有美洲林蝠属(美洲林蝠)、食果蝠属(食果蝠)、叶吻蝠属(真叶吻蝠)等之数种哺乳动物。