顺序队列(C语言)
#define Queue_MAX_SIZE 20
#define OK 1
#define ERROR 0
#include <stdio.h>
#include <stdlib.h>
typedef int QueueType; //队列元素类型
typedef struct
{
QueueType *pBase; //队列指针
QueueType front; //队头索引
QueueType rear; //队尾索引
int maxSize; //当前分配最大容量
}Queue;
//队列的初始化
int InitQueue(Queue *p)
{
p->pBase = (QueueType *)malloc(Queue_MAX_SIZE * sizeof(QueueType));
if (p->pBase == NULL) return ERROR; //内存分配失败
p->front = ;
p->rear = ; //初始化 队头队尾索引均为0
p->maxSize = Queue_MAX_SIZE;
return ;
}
//销毁队列
void destroyQueue(Queue *p)
{
free(p);
p = NULL; }
//清空队列
void clearQueue(Queue *p)
{
p->front = ;
p->rear = ;
}
//判断队列是否为空
int isEmpityQueue(Queue *p)
{
if (p->front == p->rear)
return OK;
return ERROR; }
/*
*在循环队列中,“队满”和“队空”的条件有可能是相同的,都是front==rear,
*这种情况下,无法区别是“队满”还是“队空”。
*针对这个问题,有3种可能的处理方法:
*(1)另设一个标志以区别是“队满”还是“队空”。(即入队/出队前检查是否“队满”/“队空”)
*(2)设一个计数器,此时甚至还可以省去一个指针。
*(3)少用一个元素空间,即约定队头指针在队尾指针的下一位置时就作为“队满”的标志,
*即“队满”条件为:(PQueue->rear+1)%MAX_SIZE == PQueue->front。
* 【这里采用了第3种处理方法】
*/
//判断队列是否满
int isFullQueue(Queue *p)
{
if ((p->rear + ) % p->maxSize == p->front)
return OK;
return ERROR; }
//获得队列长度
int getQueueLen(Queue *p)
{
return (p->rear - p->front + p->maxSize) % p->maxSize;
}
//新元素入队
int enQueue(Queue *p, QueueType e)
{
if (isFullQueue(p) == OK)
{
printf("队列已满\n");
return ERROR;
}
p->pBase[p->rear] = e;
p->rear = (p->rear + ) % p->maxSize;
return OK;
}
//队头元素出列
int deQueue(Queue *p, QueueType *pe)
{
//如果队列为空 则返回ERROR
if (isEmpityQueue(p) == OK)
{
printf("队列为空,出队失败\n");
return ERROR; }
*pe = p->pBase[p->front];
p->front = (p->front + ) % p->maxSize; return OK;
}
//遍历队列
void queueTraverse(Queue *p)
{
int i = p->front;
printf("遍历队列\n");
while (i != p->rear)
{
printf("%d ", p->pBase[i]);
i = (i + ) % p->maxSize;
}
printf("\n"); } int main()
{
QueueType *pe;
pe = (QueueType*)malloc(sizeof(QueueType));
Queue *PQueue = (Queue *)malloc(sizeof(Queue));
if (!PQueue->pBase)
{
printf("给队列对象分配内存失败\n");
return -;
} //调用初始化队列的函数
InitQueue(PQueue);
//调用出队函数
enQueue(PQueue, );
enQueue(PQueue, );
enQueue(PQueue, );
enQueue(PQueue, );
enQueue(PQueue, );
enQueue(PQueue, );
enQueue(PQueue, );
enQueue(PQueue, );
//调用遍历队列的函数
queueTraverse(PQueue);
//调用出队函数
if (deQueue(PQueue, pe))
{
printf("出队一次,元素为:%d\n", *pe);
}
queueTraverse(PQueue);
if (deQueue(PQueue, pe))
{
printf("出队一次,元素为:%d\n", *pe);
}
queueTraverse(PQueue); destroyQueue(PQueue); return ; }
顺序队列(C语言)的更多相关文章
- 队列的含义以及C语言实现顺序队列
队列,和栈一样,也是一种对数据的"存"和"取"有严格要求的线性存储结构. 什么是队列 与栈结构不同的是,队列的两端都"开口",要求数据只能从 ...
- C语言顺序队列
顺序队列是一种只能在一头进和另一头出的数据结构,所以结构体里设2个指针分别指向头部和尾部,用数组来存储数据. #define MAXSIZE 1024 typedef int elemtype; ty ...
- 数据结构 - 顺序队列的实行(C语言)
数据结构-顺序队列的实现 1 顺序队列的定义 线性表有顺序存储和链式存储,队列作为一种特殊的线性表,也同样存在这两种存储方式.我们先来看队列的顺序存储结构. 队列的顺序储存结构:用数组存储队列,为了避 ...
- 顺序队列与链式队列--C语言实现
关于队列,因为我自己在平时使用不多,所以在这里直接将队列的两种存储方式放在一起,作为一篇随笔,这两份代码均可直接运行,亲测.注释写的应该也算比较详细了,就不过多的解释了 顺序队列 #include&l ...
- 顺序队列C/C++实现
#include <iostream> using namespace std; const int MAXSIZE = 1000; typedef int ELEMTYPE; const ...
- 数据结构Java实现07----队列:顺序队列&顺序循环队列、链式队列、顺序优先队列
一.队列的概念: 队列(简称作队,Queue)也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置插入和删除,而队列只允许在其一端进行插入操作在其 ...
- 顺序队列之C++实现
下面介绍下用C++实现的顺序队列,在VC6下调试通过. 1.文件组织形式 2.sq.h顺序队列类的说明 #ifndef _SQ_H_ #define _SQ_H_ typedef int dataTy ...
- Javascript数据结构与算法--队列(顺序队列、优先队列、循环队列)的实现与用法
前言 队列和栈非常类似,前面已经讲过了栈的实现与用法,现在我们来说说队列. 队列介绍 队列遵循FIFO(First In First Out,先进先出)原则的一组有序的项. 队列是一种特殊的线性表,特 ...
- java 实现简单的顺序队列
package com.my; import java.util.Arrays; /** * 顺序队列 * @author wanjn * */ public class ArrayQueue { p ...
随机推荐
- inode引起的Linux无法创建新文件,磁盘空间不足
df -h,判断硬盘空间是否已经满了,占用率达100% ,就可以断定该分区满了. df -ia,占用率达100%,也会导致无法创建新文件.一般都是存在大量小文件引起的. inode包含文件的元信息,具 ...
- api.js封装请求
1. 传入对象格式如 { a:{ getData:{ url: 'xx/xx/xx', method: 'get', require:['id', 'name'], // 简单检查 必传参数确实则不发 ...
- 2017-2018-2 20165312 实验四《Android程序设计》实验报告
2017-2018-2 20165312 实验四<Android程序设计>实验报告 一.安装Android Studio并进行Hello world测试和调试程序 安装Android St ...
- GraphicsMagick命令
[ convert | identify | mogrify | composite | montage | compare | display | animate | import | conjur ...
- Quartz入门及简单实现
Quartz简介 Quartz是一个功能丰富的开源作业调度库,可以集成到几乎任何Java应用程序中 - 从最小的独立应用程序到最大的电子商务系统.Quartz可以用来创建执行数十,数百乃至数万个作业的 ...
- svn Mac
将已有项目放到svn服务端 svn import 已有项目地址 服务端地址 -m '注释必须填写' 例子 svn import /Applications/Emma/workspace/tansun/ ...
- Tomcat 配置详解和优化
2018年01月09日 18:14:41 tianxiaojun2014 阅读数:306 转自:https://www.cnblogs.com/xbq8080/p/6417671.html htt ...
- Android 开发 框架系列 百度语音合成
官方文档:http://ai.baidu.com/docs#/TTS-Android-SDK/6d5d6899 官方百度语音合成控制台:https://cloud.baidu.com/product/ ...
- # 20175213 2018-2019-2 《Java程序设计》第1周学习总结
在本周的java学习中,我收获了很多也遇到了很多的困难1.在寒假的预学习中,因为没能完全的安好虚拟机,导致在本周的学习一开始,虚拟机就崩溃了,所以又重新开始重头安装虚拟机.但因为网速等各种问题,虚拟机 ...
- android studio 创建图标
参考 https://www.cnblogs.com/c546170667/p/5975550.html File-New-Image Asset