队列->队列的表示和实现
文字描述
队列是和栈相反,队列是一种先进先出(first in first out,缩写FIFO)的线性表,它只允许在表的一端进行插入,而在另一端进行删除。和生活中的排队相似,最早进入队列的元素最早离开。在队列中,允许插入的一端加队尾,允许删除的一端叫队头。
另外除了栈和队列,还有一种限定性数据结构是双端队列,它是一种插入和删除操作在表的两端进行的线性表。可以用一个铁道铁轨网络来比喻双端队列。
示意图

表示和实现
A 链队列(链式表示)
用链表表示的队列简称链队列。一个链队列需要分别指向队头和队为的指针才能唯一确定。一般,为了操作方便,会给链队列添加一个不存数据的头结点,并令头结点的next指针指向头结点。由此,空的链队列的判决条件为头指针和尾指针均指向头结点。

代码实现
//
// Created by lady on 19-4-4.
//
#include <stdio.h>
#include <stdlib.h>
#include <string.h> typedef struct QElemType{
char data[];
}QElemType; typedef struct QNode{
QElemType data;
struct QNode *next;
}QNode, *QueuePtr;
typedef struct LinkQueue{
QueuePtr front;
QueuePtr rear;
}LinkQueue; static int InitQueue(LinkQueue *Q);
static int CreateQueue(LinkQueue *Q, int n);
static int DestoryQueue(LinkQueue *Q);
static int EnQueue(LinkQueue *Q, QElemType e);
static int DeQueue(LinkQueue *Q, QElemType *e);
static int QueueTraverse(LinkQueue Q); int main(int argc, char *argv[])
{
LinkQueue Q;
int i = ;
if(CreateQueue(&Q, )<){
return -;
}
printf("依次出队列!\n");
QElemType e;
while(!DeQueue(&Q, &e)){
printf("%s\n", e.data);
}
printf("销毁队列!\n");
DestoryQueue(&Q);
return ;
} static int InitQueue(LinkQueue *Q)
{
if(Q == NULL){
return -;
}
Q->front = (QueuePtr)malloc(sizeof(QNode));
Q->front->next = NULL;
Q->rear = Q->front;
if(Q->front == NULL){
return -;
}else{
return ;
}
} static int CreateQueue(LinkQueue *Q, int n)
{
printf("创建一个长度为%d,以链式存储的链队列!\n", n);
if(InitQueue(Q)<){
return -;
}
int i = ;
QElemType e;
for(i=; i<n; i++){
printf("输入第%d个元素:", i+);
scanf("%s[^\\n]", e.data);
if(EnQueue(Q, e)<){
return -;
}
}
return ;
} static int DestoryQueue(LinkQueue *Q)
{
QueuePtr p = Q->front->next;
QueuePtr q = NULL;
while(p){
q = p;
p = p->next;
free(q);
}
if(Q->front){
free(Q->front);
Q->front = NULL;
}
return ;
}
static int EnQueue(LinkQueue *Q, QElemType e)
{
QueuePtr p = (QueuePtr)malloc(sizeof(QNode));
if(p == NULL){
return -;
}
p->data = e;
p->next = NULL;
Q->rear->next = p;
Q->rear = p;
return ;
} static int DeQueue(LinkQueue *Q, QElemType *e)
{
if(Q->front == Q->rear){
return -;
}
QueuePtr p = Q->front->next;
(*e) = p->data;
Q->front->next = p->next;
if(p == Q->rear){
Q->rear = Q->front;
}
free(p);
return ;
} static int QueueTraverse(LinkQueue Q)
{
QueuePtr p = Q.front->next;
while(p){
printf("%s\n", p->data.data);
p = p->next;
}
return ;
}
链队列
代码运行
/home/lady/CLionProjects/untitled/cmake-build-debug/untitled
创建一个长度为5,以链式存储的链队列!
输入第1个元素:a1
输入第2个元素:a2
输入第3个元素:a3
输入第4个元素:a4
输入第5个元素:a5
依次出队列!
a1
a2
a3
a4
a5
销毁队列! Process finished with exit code 0
B 循环队列(顺序表示)
和顺序栈类似,除了用一组地址连续的存储单元依次存放从队头到队尾的元素外,需设两个指针front和rear分别指向队头元素和队尾元素的位置。一般,为了充分利用空间,会将顺序队列设置为循环模式。在循环队列中,判断队列空间是否为”空“还是”满”。可有两种处理方法:1)单独设置一个标志位以区分队列是否为满 2)少用一个元素空间,约定以”队列头指针在队列指针的下一位置(指环状的下一个位置)上”作为队列满状态的标志。

代码实现
//
// Created by lady on 19-4-4.
// #include <stdio.h>
#include <stdlib.h>
#include <string.h> //----循环队列----队列的顺序存储结构
#define MAXQSIZE 6 //循环队列的最大长度
typedef struct QElemType{
char s[];
}QElemType;
typedef struct SqQueue{
QElemType *base;//初始化的动态分配存储空间
int front; //头指针,队列不为空的话指向队列头元素
int rear; //尾指针,队列不为空的话指向队列尾元素的下一个位置
}SqQueue; //初始化队列
static int InitQueue(SqQueue *Q);
//求队列长度
static int QueueLength(SqQueue Q);
//入队列
static int EnQueue(SqQueue *Q, QElemType e);
//出队列
static int DeQueue(SqQueue *Q, QElemType *e);
//遍历队列
static int TraverseQueue(SqQueue Q); static int CreateQueue(SqQueue *Q, int l){
if(InitQueue(Q) < ){
return ;
}
printf("创建一个长度为%d的顺序存储的循环队列\n", l); QElemType e;
int i = ;
for(i=; i<l; i++){
printf("输入第(%d)个数据元素:", i+);
memset(e.s, , sizeof(e.s));
scanf("%s[^\\n]", e.s);
EnQueue(Q, e);
}
return ;
} int main(int argc, char *argv[])
{
QElemType e;
SqQueue Q;
if(CreateQueue(&Q, ) < ){
return -;
}
printf("队列长度为%d\n", QueueLength(Q));
TraverseQueue(Q); snprintf(e.s, sizeof(e.s), "%s", "A6");
EnQueue(&Q, e); DeQueue(&Q, &e);
DeQueue(&Q, &e); snprintf(e.s, sizeof(e.s), "%s", "A6");
EnQueue(&Q, e); TraverseQueue(Q);
return ;
} static int InitQueue(SqQueue *Q)
{
Q->base = (QElemType *)malloc(MAXQSIZE*sizeof(QElemType));
if(!Q->base){
return -;
}else{
printf("队列初始化成功,队列可保存的最大元素个数为%d\n", MAXQSIZE);
Q->front = Q->rear = ;
return ;
}
} static int QueueLength(SqQueue Q)
{
return ((Q.rear-Q.front+MAXQSIZE) % MAXQSIZE);
} static int EnQueue(SqQueue *Q, QElemType e)
{
if((Q->rear+) % MAXQSIZE == Q->front){
printf("队列已满,元素%s不能入队列!\n", e.s);
return -;
}
printf("元素%s入队列!\n", e.s);
Q->base[Q->rear] = e;
Q->rear = (Q->rear+) % MAXQSIZE;
return ;
} static int DeQueue(SqQueue *Q, QElemType *e)
{
if(Q->front == Q->rear){
return -;
}
(*e) = Q->base[Q->front];
printf("元素%d:%s出队列!\n", Q->front, (*e).s);
Q->front = (Q->front+) % MAXQSIZE;
return ;
} static int TraverseQueue(SqQueue Q)
{
printf("遍历:");
if(Q.rear == Q.front){
printf("队列是空的\n");
}
int i = Q.front;
do{
printf("%d:%s ", i, Q.base[i].s);
i = (i+)%MAXQSIZE;
if(i == Q.rear){
break;
}
}while();
printf("\n");
}
循环队列
代码运行
/home/lady/CLionProjects/untitled/cmake-build-debug/untitled
队列初始化成功,队列可保存的最大元素个数为6
创建一个长度为5的顺序存储的循环队列
输入第(1)个数据元素:a1
元素a1入队列!
输入第(2)个数据元素:a2
元素a2入队列!
输入第(3)个数据元素:a3
元素a3入队列!
输入第(4)个数据元素:a4
元素a4入队列!
输入第(5)个数据元素:a5
元素a5入队列!
队列长度为5
遍历:0:a1 1:a2 2:a3 3:a4 4:a5
队列已满,元素A6不能入队列!
元素0:a1出队列!
元素1:a2出队列!
元素A6入队列!
遍历:2:a3 3:a4 4:a5 5:A6 Process finished with exit code 0
队列->队列的表示和实现的更多相关文章
- 数据结构算法C语言实现(十二)--- 3.4循环队列&队列的顺序表示和实现
一.简述 空队列的处理方法:1.另设一个标志位以区别队列是空还是满:2.少用一个元素空间,约定以队列头指针在队尾指针下一位置上作为队列呈满的状态的标志. 二.头文件 //3_4_part1.h /** ...
- 队列->队列的应用(银行业务模拟)
文字描述 示意图 代码实现 // // Created by Zhenjie Yu on 2019-04-13. // #include <stdio.h> #include <st ...
- 剑指offer-用两个栈来实现一个队列-队列与栈-python
用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 思路:使用两个栈,stackA 用来接收node stackB 用来接收 stackA 的出栈 # -*- cod ...
- TCP控制位 sendUrgentData 队列 队列元素 优先级 极限 急停 置顶
Socket (Java Platform SE 7 ) https://docs.oracle.com/javase/7/docs/api/java/net/Socket.html#sendUrge ...
- [ACM训练] 算法初级 之 数据结构 之 栈stack+队列queue (基础+进阶+POJ 1338+2442+1442)
再次面对像栈和队列这样的相当基础的数据结构的学习,应该从多个方面,多维度去学习. 首先,这两个数据结构都是比较常用的,在标准库中都有对应的结构能够直接使用,所以第一个阶段应该是先学习直接来使用,下一个 ...
- jQuery源码分析系列(38) : 队列操作
Queue队列,如同data数据缓存与Deferred异步模型一样,都是jQuery库的内部实现的基础设施 Queue队列是animate动画依赖的基础设施,整个jQuery中队列仅供给动画使用 Qu ...
- 数据结构(c语言第2版)-----了解链表,栈,队列,串
关于链表我觉得这都是最基本的东西,但是不常见,在实际的应用中很少的使用,了解它会用就OK,不需要研究的那么深,除非做那种内存压缩,存储方面工作. C语言中动态申请空间 malloc() q=(dlin ...
- javascript数据结构与算法---队列
javascript数据结构与算法---队列 队列是一种列表,不同的是队列只能在队尾插入元素,在队首删除元素.队列用于存储按顺序排列的数据,先进先出,这点和栈不一样(后入先出).在栈中,最后入栈的元素 ...
- ios--进程/多线程/同步任务/异步任务/串行队列/并行队列(对比分析)
现在先说两个基本的概念,啥是进程,啥是线程,啥又是多线程;先把这两个总是给弄清再讲下面的 进程:正在进行的程序,我们就叫它进程. 线程:线程就是进程中的一个独立的执行路径.这句话怎么理解呢! 一个程序 ...
随机推荐
- 前端 $.parseJson()
$.parseJSON() 函数用于将符合标准格式的的JSON字符串转为与之对应的JavaScript对象. 例子: 这里首先给出JSON字符串集,字符串集如下: var data=" { ...
- 【原创】大叔经验分享(9)yarn重要配置yarn.nodemanager.local-dirs
yarn中有一个比较重要的配置yarn.nodemanager.local-dirs,如果配置的不好,在饱和状态运行下集群会出现很多问题:1 默认配置${hadoop.tmp.dir}/nm-loca ...
- 初学python之路-day02
python,诞生于1989年的圣诞,Guido van Rossum为了打发无聊,因此发明了python,并且开放了其源代码,使得这门语言在随后的几十年的发展的越来越广.现今,2.x版本已经在2.7 ...
- NOIP基本算法
NOIP基本算法 1.二分 poj 2018 Best Cow Fences ▪ http://poj.org/problem?id=2018 ▪ 题意:给定一个正整数数列
- 错误: Error creating bean with name 'studentController': Unsatisfied dependency expressed through field 'studentServiceImpl';
详细错误: 严重: Context initialization failed org.springframework.beans.factory.UnsatisfiedDependencyExcep ...
- 网络流24题——分配问题 luogu 4014
题目链接:这里 本题是一个典型的费用流问题,可以作为费用流建图模板使用 首先看到,每个人只能做一件工作,每件工作只能做一次,一个人做某件工作有一定的收益 那么我们建立一个超级源点st和超级终点ed,然 ...
- highcharts的dataLabels如何去处阴影
问题: 在使用highcharts生成的图标中dataLabels是有阴影的,通常是影响美观,那么如何去除阴影呢? 原因:是因为highcharts将dataLabels生成的标签是tspan,里面有 ...
- Codeforces 840C On the Bench dp
On the Bench 两个数如果所有质因子的奇偶性相同则是同一个数,问题就变成了给你n个数, 相同数字不能相邻的方案数. dp[ i ][ j ]表示前 i 种数字已经处理完, 还有 j 个位置需 ...
- 蓝桥杯 购物单(使用word协助)
标题: 购物单 小明刚刚找到工作,老板人很好,只是老板夫人很爱购物.老板忙的时候经常让小明帮忙到商场代为购物.小明很厌烦,但又不好推辞. 这不,XX大促销又来了!老板夫人开出了长长的购物单,都是有打折 ...
- POJ 1201 Intervals (经典) (差分约束)
<题目链接> 题目大意:给你$n$段区间,$a_i,b_i,c_i$ 表示在 $[a_i,b_i]$ 区间内至少要选择$c_i$个点.现在问你在满足这n个条件的情况下,最少要选多少个点? ...