C语言队列
来源:互联网 发布:tumblr类似软件 编辑:程序博客网 时间:2024/06/07 00:00
队列
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
- 基本结构
//---------队列基本结构---------struct Node //结点结构体{ DataType info; struct Node *next;};typedef struct Node Node, *PNode;struct LinkQueue{ PNode front, rear; //队列结构体};typedef struct LinkQueue LinkQueue, *PLinkQueue;
- 初始化空队列
//创建空队列PLinkQueue CreateEmptyQueue(){ PLinkQueue plqu; //队列结构体,front指针指向队头,rear指针指向队尾 plqu = (PLinkQueue)malloc(sizeof(LinkQueue)); if(plqu!=NULL) plqu->front = plqu->rear = NULL; else printf("Create Error:Out of space!\n"); return plqu;}
- 判断是否为空
bool isEmptyQueue(PLinkQueue plqu){ return (plqu->front == NULL);}
- 入队
//在队尾加入新的元素xvoid push(PLinkQueue plqu, DataType x){ PNode p; p = (PNode)malloc(sizeof(Node)); if(p == NULL) printf("Push Error: Out of space\n"); else { p->info = x; p->next = NULL; if(plqu->front == NULL) //入队的第一个元素 { plqu->front = p; //队列头指向该元素 plqu->rear = p; //队列尾指向该元素 } else //非第一个元素 { plqu->rear->next = p; //队列头不变,队列尾链入该元素 plqu->rear = p; //更新队尾 } }}
- 出队
//弹出队列头void pop(PLinkQueue plqu){ PNode p; if(plqu->front == NULL) printf("Pop Error: Empty queue\n"); else { p = plqu->front; plqu->front = plqu->front->next; //队列头更新为下一个元素 free(p); }}
测试代码
#include <cstdio>#include <stdlib.h>typedef int DataType;//---------队列基本结构---------struct Node //结点结构体{ DataType info; struct Node *next;};typedef struct Node Node, *PNode;struct LinkQueue{ PNode front, rear; //队列结构体};typedef struct LinkQueue LinkQueue, *PLinkQueue;//创建空队列PLinkQueue CreateEmptyQueue(){ PLinkQueue plqu; //队列结构体,front指针指向队头,rear指针指向队尾 plqu = (PLinkQueue)malloc(sizeof(LinkQueue)); if(plqu!=NULL) plqu->front = plqu->rear = NULL; else printf("Create Error:Out of space!\n"); return plqu;}bool isEmptyQueue(PLinkQueue plqu){ return (plqu->front == NULL);}//在队尾加入新的元素xvoid push(PLinkQueue plqu, DataType x){ PNode p; p = (PNode)malloc(sizeof(Node)); if(p == NULL) printf("Push Error: Out of space\n"); else { p->info = x; p->next = NULL; if(plqu->front == NULL) //入队的第一个元素 { plqu->front = p; //队列头指向该元素 plqu->rear = p; //队列尾指向该元素 } else //非第一个元素 { plqu->rear->next = p; //队列头不变,队列尾链入该元素 plqu->rear = p; //更新队尾 } }}//弹出队列头void pop(PLinkQueue plqu){ PNode p; if(plqu->front == NULL) printf("Pop Error: Empty queue\n"); else { p = plqu->front; plqu->front = plqu->front->next; //队列头更新为下一个元素 free(p); }}int main(){ int m, n; scanf("%d%d", &m, &n); PLinkQueue q = CreateEmptyQueue(); int cnt = 0; for(int i = 0; i < m; i ++) { int elem; scanf("%d", &elem); if(elem == 0) { printf("%d\n", q->front->info); pop(q); cnt--; } else { if(cnt == n) printf("No\n"); else { push(q, elem); cnt ++; } } } return 0;}
1 0
- C语言:队列
- 队列 C语言实现
- 队列C语言实现
- C语言循环队列
- C语言之队列
- C语言 消息队列
- C语言实现队列
- C语言队列
- C语言:链队列
- 队列(C语言)
- 队列 c语言实现
- C语言:队列
- C语言队列
- C语言实现队列
- C语言-队列
- C语言实现队列
- C语言 环形队列
- c语言:链队列
- 赋值操作符
- 一个简单的递归实现数组组元素的组合
- iOS 推送问题 registerForRemoteNotificationTypes: is not supported in iOS 8.0 and later
- Netty开源库的初步使用
- android存储方式(内部存储、外部存储)
- C语言队列
- jquery datatables 的 配置参数
- RxJava的初学随笔(一)
- Set(HashSet、TreeSet)、泛型
- java自带线程池和队列详细讲解
- fatal: Not a git repository (or any of the parent directories): .git
- stm32库函数学习篇---NVIC与外部中断
- Makefile学习
- 25 不使用加减乘除做加法