队列的顺序存储与链式存储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版)
数据结构中的栈与队列还是经常使用的,栈与队列其实就是线性表的一种应用.因为线性队列分为顺序存储和链式存储,所以栈可以分为链栈和顺序栈,队列也可分为顺序队列和链队列.本篇博客其实就是<数据结构之线 ...
随机推荐
- Java实现 蓝桥杯VIP 算法训练 -2进制(暴力)
试题 算法训练 -2进制 问题描述 给出1个十进制整数N,计算出它的-2进制表示. 输入格式 第一行:一个整数N,表示要转换的十进制数. 输出格式 第一行:N的-2进制表示. 样例输入 -13 样例输 ...
- 第九届蓝桥杯JavaC组决(国)赛真题
1:年龄问题 s夫人一向很神秘.这会儿有人问起她的年龄,她想了想说: "20年前,我丈夫的年龄刚好是我的2倍,而现在他的年龄刚好是我的1.5倍". 你能算出s夫人现在的年龄吗? 这 ...
- Java实现 LeetCode 539 最小时间差(单位转换)
539. 最小时间差 给定一个 24 小时制(小时:分钟)的时间列表,找出列表中任意两个时间的最小时间差并已分钟数表示. 示例 1: 输入: ["23:59","00:0 ...
- 第三届蓝桥杯C++B组国(决)赛真题
解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.星期几 1949年的国庆节(10月1日)是星期六. 今年(2012)的国庆节是星期一. 那么,从建国到现在,有几次国庆节正好是星期日呢 ...
- Java实现 泊松分酒
泊松是法国数学家.物理学家和力学家.他一生致力科学事业,成果颇多.有许多著名的公式定理以他的名字命名,比如概率论中著名的泊松分布. 有一次闲暇时,他提出过一个有趣的问题,后称为:"泊松分酒& ...
- Java实现第九届蓝桥杯猴子分香蕉
猴子分香蕉 题目描述 5只猴子是好朋友,在海边的椰子树上睡着了.这期间,有商船把一大堆香蕉忘记在沙滩上离去. 第1只猴子醒来,把香蕉均分成5堆,还剩下1个,就吃掉并把自己的一份藏起来继续睡觉. 第2只 ...
- Java实现第八届蓝桥杯最大公共子串
最大公共子串 最大公共子串长度问题就是: 求两个串的所有子串中能够匹配上的最大长度是多少. 比如:"abcdkkk" 和 "baabcdadabc", 可以找到 ...
- java实现第七届蓝桥杯抽签
抽签 抽签 X星球要派出一个5人组成的观察团前往W星. 其中: A国最多可以派出4人. B国最多可以派出2人. C国最多可以派出2人. .... 那么最终派往W星的观察团会有多少种国别的不同组合呢? ...
- java实现第四届蓝桥杯幸运数
幸运数 题目描述 幸运数是波兰数学家乌拉姆命名的.它采用与生成素数类似的"筛法"生成. 首先从1开始写出自然数1,2,3,4,5,6,- 1 就是第一个幸运数. 我们从2这个数开始 ...
- iOS-自定义Model转场动画-仿酷我音乐播放器效果
周末,闲来无事,仿写了酷我音乐播放器效果: 效果图如下: 实现思路: 1.实现手势处理视图旋转 2.自定义Model动画: 1.手势是利用了一个UIPanGestureRecognizer手势: 注意 ...