队列的顺序存储与链式存储c语言实现
一. 队列
1.队列定义:只允许在表的一端进行插入,表的另一端进行删除操作的线性表。
2.循环队列:把存储队列的顺序队列在逻辑上视为一个环。
循环队列状态:
初始时:Q.front=Q.rear=0
front指针移动:Q.front=(Q.front+1)%MaxSize
rear指针移动:Q.rear=(Q.rear+1)%MaxSize
队列长度:(Q.rear+MaxSize-Q.front)%MaxSize
队空条件:Q.front=Q.rear
队满条件:Q.front=Q.rear
3.区分队空和队满的三种处理
1)牺牲一个存储单元来区分队空和队满
队满条件:(Q.rear+1)%MaxSize=Q.front
队空条件:Q.front=Q.rear
队中元素个数:(Q.rear+MaxSize-Q.front)%MaxSize
2)类型中增设表示元素个数的数据成员
队空条件:Q.front=Q.rear && Q.size=0
队满条件:Q.front=Q.rear && Q.size=MaxSize
3)类型中增设tag数据成员,以区分队空还是队满
tag=0时,若因删除导致Q.front=Q.rear,则为队空
tag=1时,若因插入导致Q.front=Q.rear,则为队满
二. 循环队列的顺序存储操作
1.结构描述
typedef struct Queue{
ElemType data[MaxSize];
int front,rear,size;
}Queue;
2.初始化队列
Queue InitQueue()
{
Queue Q;
Q.front=Q.rear=Q.size=;
return Q;
}
3.判断队列是否为空
int Queue_Empty(Queue Q)
{
if(Q.front==Q.rear&&Q.size==)
return TRUE;
else
return FALSE;
}
4.判断队列是否为满
int Queue_Full(Queue Q)
{
if(Q.front==Q.rear&&Q.size==MaxSize)
return TRUE;
else
return FALSE;
}
5.入队
int InQueue(Queue *q)
{
if(Queue_Full(*q))
return FALSE;
ElemType x;
printf("输入入队元素:");
scanf("%d",&x);
q->data[q->rear]=x;
q->rear=(q->rear+)%MaxSize;
q->size++;
return TRUE;
}
6.出队
int OutQueue(Queue *q,ElemType *x)
{
if(Queue_Empty(*q))
return FALSE;
*x=q->data[q->front];
q->front=(q->front+)%MaxSize;
q->size--;
return TRUE;
}
7.完整代码
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
#define MaxSize 10
typedef int ElemType;
typedef struct Queue{
ElemType data[MaxSize];
int front,rear,size;
}Queue; Queue InitQueue();//初始化队列
int Queue_Empty(Queue Q);//判断队列是否为空 ,用size来判断空还是满
int Queue_Full(Queue Q);//判断队列是否满
int InQueue(Queue *q);//入队
int OutQueue(Queue *q,ElemType *x);//出队,并记录出队元素
int main()
{
ElemType x;
Queue Q=InitQueue();
InQueue(&Q);
InQueue(&Q);
InQueue(&Q);
InQueue(&Q);
printf("此时队列长度:%d\n",Q.size);
return ;
} Queue InitQueue()
{
Queue Q;
Q.front=Q.rear=Q.size=;
return Q;
} int Queue_Empty(Queue Q)
{
if(Q.front==Q.rear&&Q.size==)
return TRUE;
else
return FALSE;
} int Queue_Full(Queue Q)
{
if(Q.front==Q.rear&&Q.size==MaxSize)
return TRUE;
else
return FALSE;
} int InQueue(Queue *q)
{
if(Queue_Full(*q))
return FALSE;
ElemType x;
printf("输入入队元素:");
scanf("%d",&x);
q->data[q->rear]=x;
q->rear=(q->rear+)%MaxSize;
q->size++;
return TRUE;
} int OutQueue(Queue *q,ElemType *x)
{
if(Queue_Empty(*q))
return FALSE;
*x=q->data[q->front];
q->front=(q->front+)%MaxSize;
q->size--;
return TRUE;
}
运行示例:
三. 队列的链式存储
链队列:同时带有队头指针和队尾指针的单链表。
1.结构描述
typedef struct Node{
ElemType data;
struct Node *next;
}Node; typedef struct Queue{
struct Node *front,*rear;
}Queue;
2.链队列初始化
Queue InitQueue()
{
Queue Q;
Q.front=Q.rear=(Node*)malloc(sizeof(Node));
Q.front->next=NULL;
return Q;
}
3.判断队列是否为空
int Queue_Empty(Queue Q)
{
if(Q.front==Q.rear)
return TRUE;
else
return FALSE;
}
4.入队
void InQueue(Queue *q)
{
ElemType x;
printf("输入入队元素:");
scanf("%d",&x);
Node *p=(Node*)malloc(sizeof(Node));
p->data=x;
p->next=NULL;
q->rear->next=p;
q->rear=p;
}
5.出队
int OutQueue(Queue *q,ElemType *x)
{
if(Queue_Empty(*q))
{
return FALSE;
}
Node *p=q->front->next;
*x=p->data;
q->front->next=p->next;
if(q->rear==p)
{
q->rear=q->front;
}
free(p);
return TRUE;
}
6.完整代码
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
typedef int ElemType;
typedef struct Node{
ElemType data;
struct Node *next;
}Node; typedef struct Queue{
struct Node *front,*rear;
}Queue; Queue InitQueue();//链队列初始化
int Queue_Empty(Queue Q);//判断队列是否为空
void InQueue(Queue *q);//入队
int OutQueue(Queue *q,ElemType *x);//出队 int main()
{
ElemType x;
Queue Q=InitQueue();
InQueue(&Q);
InQueue(&Q);
InQueue(&Q);
OutQueue(&Q,&x);
printf("出队元素:%d\n",x);
return ;
} Queue InitQueue()
{
Queue Q;
Q.front=Q.rear=(Node*)malloc(sizeof(Node));
Q.front->next=NULL;
return Q;
} int Queue_Empty(Queue Q)
{
if(Q.front==Q.rear)
return TRUE;
else
return FALSE;
} void InQueue(Queue *q)
{
ElemType x;
printf("输入入队元素:");
scanf("%d",&x);
Node *p=(Node*)malloc(sizeof(Node));
p->data=x;
p->next=NULL;
q->rear->next=p;
q->rear=p;
} int OutQueue(Queue *q,ElemType *x)
{
if(Queue_Empty(*q))
{
return FALSE;
}
Node *p=q->front->next;
*x=p->data;
q->front->next=p->next;
if(q->rear==p)
{
q->rear=q->front;
}
free(p);
return TRUE;
}
运行示例:
队列的顺序存储与链式存储c语言实现的更多相关文章
- 栈的顺序存储和链式存储c语言实现
一. 栈 栈的定义:栈是只允许在一端进行插入或删除操作的线性表. 1.栈的顺序存储 栈顶指针:S.top,初始设为-1 栈顶元素:S.data[S.top] 进栈操作:栈不满时,栈顶指针先加1,再到栈 ...
- 线性表的顺序存储和链式存储c语言实现
一.线性表的顺序存储 typedef int ElemType;typedef struct List { ElemType *data;//动态分配 ,需要申请空间 int length; }Lis ...
- 数据结构导论 四 线性表的顺序存储VS链式存储
前几章已经介绍到了顺序存储.链式存储 顺序存储:初始化.插入.删除.定位 链式存储:初始化.插入.删除.定位 顺序存储:初始化 strudt student{ int ID://ID char nam ...
- 算法与数据结构(一) 线性表的顺序存储与链式存储(Swift版)
温故而知新,在接下来的几篇博客中,将会系统的对数据结构的相关内容进行回顾并总结.数据结构乃编程的基础呢,还是要不时拿出来翻一翻回顾一下.当然数据结构相关博客中我们以Swift语言来实现.因为Swift ...
- 线性表的顺序存储和链式存储的实现(C)
//线性表的顺序存储 #include <stdio.h>typedef int DataType;#define MaxSize 15//定义顺序表typedef struct { Da ...
- C 数据结构1——线性表分析(顺序存储、链式存储)
之前是由于学校工作室招新,跟着大伙工作室招新训练营学习数据结构,那个时候,纯碎是小白(至少比现在白很多)那个时候,学习数据结构,真的是一脸茫然,虽然写出来了,但真的不知道在干嘛.调试过程中,各种bug ...
- 线性表的链式存储C语言版
#include <stdio.h> #include <malloc.h> #define N 10 typedef struct Node { int data; stru ...
- 线性表的链式存储——C语言实现
SeqList.h #ifndef _WBM_LIST_H_ #define _WBM_LIST_H_ typedef void List; typedef void ListNode; //创建并且 ...
- 算法与数据结构(二) 栈与队列的线性和链式表示(Swift版)
数据结构中的栈与队列还是经常使用的,栈与队列其实就是线性表的一种应用.因为线性队列分为顺序存储和链式存储,所以栈可以分为链栈和顺序栈,队列也可分为顺序队列和链队列.本篇博客其实就是<数据结构之线 ...
随机推荐
- elasticsearch中保存时间格式
利用logstash从文档中导入数据到es中,若未事先设定数据格式,有可能存储时间并未保存为date格式而是text格式. 时间若保存为text,则在会以字符串数组格式存储在es中,是乱序,不好查询. ...
- Java实现 蓝桥杯 算法训练 Cowboys
试题 算法训练 Cowboys 问题描述 一个间不容发的时刻:n个牛仔站立于一个环中,并且每个牛仔都用左轮手枪指着他旁边的人!每个牛仔指着他顺时针或者逆时针方向上的相邻的人.正如很多西部片那样,在这一 ...
- Java实现 蓝桥杯 历届试题 城市建设
问题描述 栋栋居住在一个繁华的C市中,然而,这个城市的道路大都年久失修.市长准备重新修一些路以方便市民,于是找到了栋栋,希望栋栋能帮助他. C市中有n个比较重要的地点,市长希望这些地点重点被考虑.现在 ...
- java实现第四届蓝桥杯有理数类
有理数类 题目描述 有理数就是可以表示为两个整数的比值的数字.一般情况下,我们用近似的小数表示.但有些时候,不允许出现误差,必须用两个整数来表示一个有理数. 这时,我们可以建立一个"有理数类 ...
- 如何监控 Linux 服务器状态?
Linux 服务器我们天天打交道,特别是 Linux 工程师更是如此.为了保证服务器的安全与性能,我们经常需要监控服务器的一些状态,以保证工作能顺利开展. 本文介绍的几个命令,不仅仅适用于服务器监控, ...
- CRC循环冗余校验---模2除法解析
关于模2除法,网上的人说了一大堆规则和原理,感觉很容易把小白绕进去,下面我只说怎么计算,不说其中的规则和原理.
- Flask URL构建
Flask URL构建 url_for()函数对于动态构建特定函数的URL非常有用.该函数接受函数的名称作为第一个参数,以及一个或多个关键字参数,每个参数对应于URL的变量部分. 以下脚本演示了如何使 ...
- python工业互联网应用实战2—从需求开始
前言:随着国家工业2025战略的推进,工业互联网发展将会提速,将迎来一个新的发展时期,越来越多的企业开始逐步的把产线自动化,去年年底投产的小米亦庄的智能工厂就是一个热议的新闻.小米/华为智能工厂只能说 ...
- Jmeter基础002----Jmeter简单使用
一.Jmeter概述 1.概述 JMeter是Apache公司使用JAVA开发的一款开源测试工具,它的功能强大.高效,可以模拟一些高并发或多次循环等测试场景,使用方便灵活. 2.使用 安装配置java ...
- cb51a_c++_STL_算法_根据第n个元素排序nth_element
cb51a_c++_STL_算法_根据第n个元素排序nth_elementnth_element(b,n,e),比如最大的5个数排序,或者最小的几个数nth_element(b,n,e,p)对比:pa ...