#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语言)的更多相关文章

  1. 队列的含义以及C语言实现顺序队列

    队列,和栈一样,也是一种对数据的"存"和"取"有严格要求的线性存储结构. 什么是队列 与栈结构不同的是,队列的两端都"开口",要求数据只能从 ...

  2. C语言顺序队列

    顺序队列是一种只能在一头进和另一头出的数据结构,所以结构体里设2个指针分别指向头部和尾部,用数组来存储数据. #define MAXSIZE 1024 typedef int elemtype; ty ...

  3. 数据结构 - 顺序队列的实行(C语言)

    数据结构-顺序队列的实现 1 顺序队列的定义 线性表有顺序存储和链式存储,队列作为一种特殊的线性表,也同样存在这两种存储方式.我们先来看队列的顺序存储结构. 队列的顺序储存结构:用数组存储队列,为了避 ...

  4. 顺序队列与链式队列--C语言实现

    关于队列,因为我自己在平时使用不多,所以在这里直接将队列的两种存储方式放在一起,作为一篇随笔,这两份代码均可直接运行,亲测.注释写的应该也算比较详细了,就不过多的解释了 顺序队列 #include&l ...

  5. 顺序队列C/C++实现

    #include <iostream> using namespace std; const int MAXSIZE = 1000; typedef int ELEMTYPE; const ...

  6. 数据结构Java实现07----队列:顺序队列&顺序循环队列、链式队列、顺序优先队列

    一.队列的概念: 队列(简称作队,Queue)也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置插入和删除,而队列只允许在其一端进行插入操作在其 ...

  7. 顺序队列之C++实现

    下面介绍下用C++实现的顺序队列,在VC6下调试通过. 1.文件组织形式 2.sq.h顺序队列类的说明 #ifndef _SQ_H_ #define _SQ_H_ typedef int dataTy ...

  8. Javascript数据结构与算法--队列(顺序队列、优先队列、循环队列)的实现与用法

    前言 队列和栈非常类似,前面已经讲过了栈的实现与用法,现在我们来说说队列. 队列介绍 队列遵循FIFO(First In First Out,先进先出)原则的一组有序的项. 队列是一种特殊的线性表,特 ...

  9. java 实现简单的顺序队列

    package com.my; import java.util.Arrays; /** * 顺序队列 * @author wanjn * */ public class ArrayQueue { p ...

随机推荐

  1. pt-table-checksum校验与pt-table-sync修复数据

    1:下载工具包 登录网站下载相应的工具包 https://www.percona.com/downloads/percona-toolkit/LATEST/ 2:安装 (1)yum安装: sudo y ...

  2. 32. linux下oracle数据库定时备份

    这里以oradatabak.sh(里面的内容要根据实际修改)脚本放在/u01/11g/datapump下为例: #1.添加脚本执行权限 chmod +x /u01/11g/datapump/orada ...

  3. mvc:view-controller标签使用

    mvc:view-controller可以在不需要Controller处理request的情况,转向到设置的View,完成无Controller的path和view的直接映射. 1.重定向 <m ...

  4. 使用 C++ REST SDK 进行网络编程

    安装 C++ REST SDK $ brew install cpprestsdk $ brew install boost $ brew install libressl 创建工程 打开 Xcode ...

  5. Mybaits

    1.Mybatis全注解形式  (在注解上不能直接使用动态Sql,必须要在前后面加上<script>SQL</script>标签,否则会报错): @Select("& ...

  6. Linux下常用系统分析工具总结(转)

    1.1 top top命令可以实时动态地查看系统的整体运行情况,是一个综合了多方信息监测系统性能和运行信息的实用工具. Top常用的可选参数和其对应的含义如下: (1)-c:显示完整的命令: (2)- ...

  7. hbase--知识点总结2

    --用java操作hbase 1.配置jar包环境 创建hbase项目 --> 新建folder文件夹 --> 将hbase相关jar包全部导入到java项目之中 --> add b ...

  8. Linux学习-linux系统下安装jdk和tomcat,以及遇到的问题清单

    安装JDK 1. 在usr目录下建立java安装目录 cd /usr mkdir java   2.下载jdk包 登录网址:http://www.oracle.com/technetwork/java ...

  9. C++中如何对输出几位小数进行控制(setprecision)

  10. python 网络内容: 初识socket

    一 C\S架构,客户端服务端架构 客户端(client) : 享受服务端提供的服务 服务端(server) : 给客户端提供服务 B\S 浏览器和服务端 B(browser) 二 网络通信的整个流程( ...