C语言队列
2016-01-18 21:06
387 查看
队列
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(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); }
入队
//在队尾加入新的元素x void 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); }
//在队尾加入新的元素x void 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;
}
相关文章推荐
- C++术语
- 【C++】 数组
- C++ 流
- <c++>时间输出
- C语言中如何查看程序运行了多久?
- 蓝桥杯2015年省赛B组C/C++题解
- C语言简介及进制换算
- 浅谈 C++ 中的 new/delete 和 new[]/delete[]
- 线程池与cp命令的实现
- Face Alignment at 3000FPS(C++版)工程配置遇到的小问题
- C++Primer第5版学习笔记(一)
- 将两个数组中的元素有序存入到一个链表中(C语言)
- C++学习之继承篇二(隐藏篇)
- C语言 位运算
- C语言 内存四大存储区域
- iOS 学习第十天 C语言 全局变量和局部变量
- C++ primer 学习笔记(第一章)
- C#调用C++Dll
- 【C++探索之旅】第一部分第五课:简易计算器
- 【C++探索之旅】第一部分第五课:简易计算器