存档

 #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. C++各种指针辨析

    1)int *p p与*结合,表明p是一个指针 然后前面int说明p是一个整形的指针 2)int *p[n] 因为[]比*优先级高,所以p先与[]结合,表明p是个数组,然后这个数组在与*结合,说明数组 ...

  2. S7-200以太网通信

    一.西门子网络系统 二.s7-200通过以太网模块接入以太网 三.S7-200可以接入的以太网系统 四.S7-200以太网通讯实验 五.实验硬件系统组成 六.S7-200作为服务器的配置 1.进入以太 ...

  3. xcode编译报错unknown error -1=ffffffffffffffff Command /bin/sh failed with exit code 1

    升级完xcode9.1之后,编译项目出现如下错误: CI今日构建时报出如下错误: /Users/xxx/Library/Developer/Xcode/DerivedData/Snowball-ebl ...

  4. Xamarin截取/删除emoji表情bug解决方案

    大家都知道,一个英文=1字节,一个汉字2字节,而一个emoji表情=4个字节,在有这三种混用的时候,比如app聊天界面,那么删除和截取便成了很头痛的事情. 问题描述 截取导致乱码,如下图: 解决方案 ...

  5. tesserat训练中文备忘录

    最近用OCR识别身份证,用的tesseract引擎.但是google自带的中文库是在太慢了,尤其是对于性别.民族这样结果可以穷举的特征信息而言,完全可以自己训练字库.自己训练字库不仅可以提高识别速度, ...

  6. js计算字数

    <html> <head> <meta http-equiv="Content-Type" content="text/html; char ...

  7. php-自动过滤、自动填充、自动验证

    最近又学到了一些新技巧,和大家分享下. 第一.当一个表单有很大内容时,我们在表单处理页面接收这些表单的值的时候就会重复 接收,于是就有了自动过滤的解决之法(核心就是把数据表里需要的字段接收) 首先:我 ...

  8. 解决openssh漏洞,升级openssh版本

    关于解决漏洞的问题我就不详说了,主要就是升级版本.这里我们就直接简单记录下步骤: 1.升级 使用root用户登录系统进入到/home/guankong ,上传openssh-6.6p1.tar.gz到 ...

  9. Java_Date_02_截断日期到日

    oracle 的 trunc 函数能很方便的将日期截断.现在有个需求,需要用java实现与 oracle 的 trunc 函数 相同的功能. 1.需求:将日期截断到日 即 将格式为 2018-01-0 ...

  10. Android 执行 adb shell 命令

    Android 执行Adb shell 命令大多需要root权限,Android自带的Runtime. getRuntime().exec()容易出错,在网上找到了一个执行adb shell命令的类 ...