存档

 #include "iostream.h"
#include "stdlib.h"
#define max 20
typedef char elemtype;
#include "queue.h"
void main()
{
elemtype e;
queue q;
cout<<"(1)初始化队列q"<<endl;
initqueue(q);
cout<<"(2)队列为"<<(queueempty(q)?"空":"非空")<<endl;
cout<<"(3)依次输入字母序列,以'#'结束:"<<endl;
cin>>e;
while(e!='#')
{
enqueue(q,e);
cin>>e;
}
cout<<"(4)队列为"<<(queueempty(q)?"空":"非空")<<endl;
e=dequeue(q);
cout<<"(5a)出队一个元素dequeue()为:"<<e<<endl;
if(dequeue1(q,e))
cout<<"(5b)出队一个元素dequeue1()为:"<<e<<endl;
cout<<"(6)队列q的元素个数:"<<queuelength(q)<<endl;
cout<<"(7)清空队列"<<endl;
clearqueue(q);
cout<<"(8)队列q的元素个数:"<<queuelength(q)<<endl;
cout<<"(9)字符abc依次入队列"<<endl;
enqueue(q,'a');
enqueue(q,'b');
enqueue(q,'c');
e=gethead(q);
cout<<"(10a)队头元素gethead()为:"<<e<<endl;
if (gethead1(q,e))
cout<<"(10b)队头元素gethead1()为:"<<e<<endl;
cout<<"(11)队列的元素个数:"<<queuelength(q)<<endl;
cout<<"(12)所有元素出队列:";
while(!queueempty(q))
cout<<dequeue(q)<<" ";
cout<<endl;
cout<<"(13)队列q的元素个数:"<<queuelength(q)<<endl;
cout<<"(14)释放队列"<<endl;
destoryqueue(q);
}
 typedef struct
{
elemtype *base;//动态分配存储空间
int front;//头指针,若队列不空指向队列队头元素
int rear;//尾指针,若队列不空指向队列队尾元素的下一个位置
}queue;
void initqueue(queue &q)
{
//初始化队列
q.base=new elemtype[max];//分配存储空间
if(!q.base)
{
cout<<"队列分配失败\n";
exit(-);
}
else
q.front=q.rear=;//初始状态,front和rear都为0
}
void clearqueue(queue &q)
{
//清空队列,但不销毁
q.front=;//清空函数,恢复到初始状态
q.rear=;
}
int queueempty(queue q)
{
//判断队列是否为空
if(q.front==q.rear)//空队列,返回1,否则返回0
return ;
else
return ;
}
int queuelength(queue q)
{
//求队列中元素个数
return (q.rear-q.front+max)%max;//计算队列当前存储的元素数目
}
void enqueue(queue &q,elemtype e)
{
//入队列操作
if((q.rear+)%max==q.front)//队满的操作
{
cout<<"队满,无法插入新元素!"<<endl;
exit(-);
}
else
{
q.base[q.rear]=e;//元素e存在当前rear所指位置
q.rear=(q.rear+)%max;//rear指针后移
}
}
elemtype dequeue(queue &q)
{
//出队列操作
if(q.front==q.rear)//空队列不能出队
{
//队空
cout<<"空队列,无法删除头元素!"<<endl;
exit(-);
}
else
{
elemtype e=q.base[q.front];//当前的队列头元素作为返回值
q.front=(q.front+)%max;//front指针后移
return e;
}
}
int dequeue1(queue &q,elemtype &e)
{
//出队列操作
if(q.front==q.rear)//空队列不能出队
{
//队空
cout<<"空队列,无法删除头元素!"<<endl;
return ;
}
else
{
e=q.base[q.front];//当前的队列头元素作为返回值
q.front=(q.front+)%max;//front指针后移
return ;
}
}
elemtype gethead(queue q)
{
//读队头元素的值,但不删除
if(q.front==q.rear)//空队列,无法读
{
//队空
cout<<"空队列,无头元素"<<endl;
exit(-);
}
else
return q.base[q.front];//队列头元素的数组下标即front本身
}
void destoryqueue(queue &q)
{
//销毁队列
delete q.base;//释放连续的存储空间
q.base=NULL;//基地址赋值为空
q.front=;//头指针赋值为0
q.rear=;//尾指针赋值为0
}
int gethead1(queue q,elemtype &e)
{
//读队头元素的值,但不删除
if(q.front==q.rear)//空队列,无法读
{
//队空
cout<<"空队列,无头元素"<<endl;
return ;
}
else
e=q.base[q.front];//队列头元素的数组下标即front本身
return ;
}

运行结果如下:

队列的存储结构的实现(C/C++实现)的更多相关文章

  1. 队列的存储结构和常见操作(c 语言实现)

    一.队列(queue) 队列和栈一样,在实际程序的算法设计和计算机一些其他分支里,都有很多重要的应用,比如计算机操作系统对进程 or 作业的优先级调度算法,对离散事件的模拟算法,还有计算机主机和外部设 ...

  2. Berkeley DB的数据存储结构——哈希表(Hash Table)、B树(BTree)、队列(Queue)、记录号(Recno)

    Berkeley DB的数据存储结构 BDB支持四种数据存储结构及相应算法,官方称为访问方法(Access Method),分别是哈希表(Hash Table).B树(BTree).队列(Queue) ...

  3. C++编程练习(6)----“实现简单的队列的链式存储结构“

    队列的链式存储结构,其实就是线性表的单链表,只不过它只能尾进头出.简称链队列. 实现代码如下: /* LinkQueue.h 头文件 */ #include<iostream> #defi ...

  4. LinkedList实现队列存储结构

    package com.tercher.demo; import java.util.LinkedList; public class Queue { //用LinkedList 实现队列的数据存储结 ...

  5. Java队列存储结构及实现

    一.队列(Queue) 队列是一种特殊的线性表,它只允许在表的前段(front)进行删除操作,只允许在表的后端(rear)进行插入操作.进行插入操作的端称为队尾,进行删除操作的端称为队头. 对于一个队 ...

  6. C#创建安全的栈(Stack)存储结构

    在C#中,用于存储的结构较多,如:DataTable,DataSet,List,Dictionary,Stack等结构,各种结构采用的存储的方式存在差异,效率也必然各有优缺点.现在介绍一种后进先出的数 ...

  7. js数据结构与算法存储结构

    数据结构(程序设计=数据结构+算法) 数据结构就是关系,没错,就是数据元素相互之间存在的一种或多种特定关系的集合. 传统上,我们把数据结构分为逻辑结构和物理结构. 逻辑结构:是指数据对象中数据元素之间 ...

  8. [置顶] ※数据结构※→☆线性表结构(queue)☆============优先队列 链式存储结构(queue priority list)(十二)

    优先队列(priority queue) 普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除.在优先队列中,元素被赋予优先级.当访问元素时,具有最高优先级的元素最先删除.优先队列具有 ...

  9. 存储结构与邻接矩阵,深度优先和广度优先遍历及Java实现

    如果看完本篇博客任有不明白的地方,可以去看一下<大话数据结构>的7.4以及7.5,讲得比较易懂,不过是用C实现 下面内容来自segmentfault 存储结构 要存储一个图,我们知道图既有 ...

随机推荐

  1. adb devices找不到设备解决办法

    问题现象: 解决办法: 1.在设备管理器Android Device中找到设备硬件Id USB\VID对应值: 3.找到.android目录,找到adb_usb.ini文件,如果没有此文件则新建一个, ...

  2. springboot 结合mybatis

    MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以使用简单的 XML ...

  3. C 真正理解二级指针

    本文转载自CSDN博主liaoxinmeng,做数据结构时遇到指针方面的问题,想了许久,因此我觉得很有必要复习一下二级指针及其使用 正文如下: 指针是C语言的灵魂,我想对于一级指针大家应该都很熟悉,也 ...

  4. three.js实现3D模型展示

    由于项目需要展示3d模型,所以对three做了点研究,分享出来 希望能帮到大家 先看看效果: three.js整体来说 不是很难 只要你静下心来研究研究 很快就会上手的 首先我们在页面上需要创建一个能 ...

  5. MySQL时间操作的系统函数用法

    我要查询获得当天凌晨30分的datetime值的方式:select ADDDATE(CURDATE(), INTERVAL TIME_TO_SEC(TIMEDIFF("00:30:00&qu ...

  6. C++ 头文件系列(ostream)

    1. 简介 头文件ostream主要定义了一个输出流类模版basic_ostream,该模版继承自basic_ios模版. 2. basic_ostream模版 2.1 sentry类 与basic_ ...

  7. SDP(0):Streaming-Data-Processor - Data Processing with Akka-Stream

    再有两天就进入2018了,想想还是要准备一下明年的工作方向.回想当初开始学习函数式编程时的主要目的是想设计一套标准API給那些习惯了OOP方式开发商业应用软件的程序员们,使他们能用一种接近传统数据库软 ...

  8. 507. Perfect Number

    We define the Perfect Number is a positive integer that is equal to the sum of all its positive divi ...

  9. java小技术之生成二维码

    把我们需要的链接或者内容生成二维码其实是一件非常容易的事情,有很多办法可以实现,这里我们采用JS方法生成. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTM ...

  10. weex Mac开发环境

    安装: 1.java的jdk下载和安装 1-1.下载.安装:省略 1-2.配置 第一步:命令行内输入touch .bash_profile命令,生成.bash_profile的隐藏配置文件,用于配置j ...