顺序队列(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 ...
随机推荐
- eclipse各版本及下载
附:Eclipse各个版本简介(http://zh.wikipedia.org/wiki/Eclipse) eclipse下载地址: https://www.eclipse.org/官网--右上角的I ...
- Ajax请求的几个小练习
Ajax请求的几个小练习 准备工作 路由中做了分发: re_path('^app01/',include('app01.url')) app01中url.py文件的内容: from django.ur ...
- web--webstorm的一些常用快捷键
Webstorm的一些常用快捷键 下面是Webstorm的一些常用快捷键: Alt+回车 导入包,自动修正 1. ctrl + shift + n: 打开工程中的文件,目的是打开当前工程下任意目录 ...
- kubernetes学习笔记之十三:基于calico的网络策略入门
一..安装calico [root@k8s-master01 ~]# kubectl apply -f https://docs.projectcalico.org/v3.3/getting-star ...
- IDEA导入Eclipse项目
目录 一.导入项目 二.启动项目 一.导入项目 1.欢迎界面,选择Import Project 2.选择源码的位置,点击OK 3.选择Eclipse模型,点击Next 4.默认选择,点击Next 5. ...
- kettle实现多表同步
本样例实现源库的所有表到目标库的同步sqlserver=>mysql(目标表存在表结构则同步),总调度如下: 由于复制记录到结果保存了多个表名,存在多个值,在高级选择对每个输入行执行一次进行循环 ...
- leetcode394
class Solution { public: string decodeString(string s) { stack<string> chars; stack<int> ...
- 尚硅谷springboot学习33-整合mybatis
引入mybatis依赖(还要引入mysql和jdbc依赖) <dependency> <groupId>org.mybatis.spring.boot</groupId& ...
- python学习Day3 变量、格式化输出、注释、基本数据类型、运算符
今天复习内容(7项) 1.语言的分类 -- 机器语言:直接编写0,1指令,直接能被硬件执行 -- 汇编语言:编写助记符(与指令的对应关系),找到对应的指令直接交给硬件执行 -- 高级语言:编写人能识别 ...
- EasyUI DataGrid设置列宽为百分比导致表头和内容错位的解决方法
在DataGrid中设置列宽为百分比一般是没有问题的 columns: [[{ title: '内容', field: '__EMPTY', width: '40%' }, { title: '隐患级 ...