两种常用的队列

与栈相反,队列是一种先进先出的线性表。它只允许在表的一端进行插入,而在另一端删除元素。

和线性表类似,队列也可以有两种存储表示。

用链表表示的队列简称链队列。下面是带头结点的单链队列的实现

 1 #include <stdio.h>
 2 #include <malloc.h>
 3
 4 typedef char QElemType;
 5 //单链队列节点
 6 typedef struct QNode
 7 {
 8     QElemType data;
 9     struct QNode *next;
10 }QNode,*QueuePtr;
11 //单链队列
12 typedef struct
13 {
14     QueuePtr front;   //队头指针
15     QueuePtr rear;    //队尾指针
16 }LinkQueue;
17
18 //初始化单链队列
19 void InitQueue(LinkQueue &Q)
20 {
21     Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));
22     Q.front->next=NULL;
23 }
24
25 //销毁单链队列
26 void DestroyQueue(LinkQueue &Q)
27 {
28     while(Q.front)
29     {
30         Q.rear=Q.front->next;
31         free(Q.front);
32         Q.front=Q.rear;
33     }
34 }
35
36 //入队列
37 void EnQueue(LinkQueue &Q,QElemType e)
38 {
39     QueuePtr p=(QueuePtr)malloc(sizeof(QNode));
40     p->data=e;
41     p->next=NULL;
42     Q.rear->next=p;
43     Q.rear=p;
44 }
45
46 //出队列
47 bool DeQueue(LinkQueue &Q,QElemType &e)
48 {
49     if(Q.front==Q.rear)
50         return false;
51     QueuePtr p=Q.front->next;
52     e=p->data;
53     Q.front->next=p->next;
54     //如果队列只有一个元素
55     if(p==Q.rear)
56         Q.front=Q.rear;
57     free(p);
58 } 

队列的顺序表示一般实现为循环队列。下面是循环队列的实现

因为Q.front=Q.rear不能区分队列是空还是满,所以下面采用少用一个元素空间来解决这个问题。

 1 #include <stdio.h>
 2 #include <malloc.h>
 3 #define MAXQSIZE 100   //最大队列长度
 4
 5 typedef char QElemType;
 6 //定义循环队列
 7 typedef struct
 8 {
 9     QElemType *base;   //
10     int front;         //头指针,若队列非空,指向队列头元素
11     int rear;          //尾指针,若队列非空,指向队列尾元素的下一个位置
12 }SqQueue;
13
14 //初始化
15 void InitQueue(SqQueue &Q)
16 {
17     Q.base=(QElemType *)malloc(MAXQSIZE*sizeof(QElemType));
18     Q.front=Q.rear=0;
19 }
20
21 //获取队列的长度
22 int QueueLength(SqQueue Q)
23 {
24     return (Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;
25 }
26
27 //入队列
28 bool EnQueue(SqQueue &Q,QElemType e)
29 {
30     //判断队列是否已经满了
31     if((Q.rear+1)%MAXQSIZE==Q.front)
32         return false;
33     Q.base[Q.rear]=e;
34     Q.rear=(Q.rear+1)%MAXQSIZE;
35     return true;
36 }
37
38 //出队列
39 bool DeQueue(SqQueue &Q,QElemType &e)
40 {
41     //判断队列是否为空
42     if(Q.rear==Q.front)
43         return false;
44     e=Q.base[Q.front];
45     Q.front=(Q.front+1)%MAXQSIZE;
46     return true;
47 } 

时间: 2024-10-02 21:34:03

两种常用的队列的相关文章

数据归一化和两种常用的归一化方法

数据标准化(归一化)处理是数据挖掘的一项基础工作,不同评价指标往往具有不同的量纲和量纲单位,这样的情况会影响到数据分析的结果,为了消除指标之间的量纲影响,需要进行数据标准化处理,以解决数据指标之间的可比性.原始数据经过数据标准化处理后,各指标处于同一数量级,适合进行综合对比评价.以下是两种常用的归一化方法: 一.min-max标准化(Min-Max Normalization) 也称为离差标准化,是对原始数据的线性变换,使结果值映射到[0 - 1]之间.转换函数如下: 其中max为样本数据的最大

【转】数据归一化和两种常用的归一化方法

转自http://www.cnblogs.com/chaosimple/p/3227271.html 数据标准化(归一化)处理是数据挖掘的一项基础工作,不同评价指标往往具有不同的量纲和量纲单位,这样的情况会影响到数据分析的结果,为了消除指标之间的量纲影响,需要进行数据标准化处理,以解决数据指标之间的可比性.原始数据经过数据标准化处理后,各指标处于同一数量级,适合进行综合对比评价.以下是两种常用的归一化方法: 一.min-max标准化(Min-Max Normalization) 也称为离差标准化

两种常用的全排列算法(java)

问题:给出一个字符串,输出所有可能的排列. 全排列有多种算法,此处仅介绍常用的两种:字典序法和递归法. 1.字典序法: 如何计算字符串的下一个排列了?来考虑"926520"这个字符串,我们从后向前找第一双相邻的递增数字,"20"."52"都是非递增的,"26 "即满足要求,称前一个数字2为替换数,替换数的下标称为替换点,再从后面找一个比替换数大的最小数(这个数必然存在),0.2都不行,5可以,将5和2交换得到"956

[转] 数据归一化和两种常用的归一化方法

原文链接:http://www.cnblogs.com/chaosimple/p/3227271.html 数据标准化(归一化)处理是数据挖掘的一项基础工作,不同评价指标往往具有不同的量纲和量纲单位,这样的情况会影响到数据分析的结果,为了消除指标之间的量纲影响,需要进行数据标准化处理,以解决数据指标之间的可比性.原始数据经过数据标准化处理后,各指标处于同一数量级,适合进行综合对比评价.以下是两种常用的归一化方法: 一.min-max标准化(Min-Max Normalization) 也称为离差

Windows校验文件哈希hash的两种常用方式

大家经常都到哪儿去下载软件和应用程序呢?有没想过下载回来的软件.应用程序或资源是否安全呢?在 Windows 10 和 Office 2016 发布当初,很多没权限的朋友都使用第三方网站去下载安装映像.而大家如何保证自己下载回来的映像或软件就是官方版本,而没有被别人篡改过呢? 很多朋友会想到将下载回来的资源校验 MD5 或 SHA1 与官方版哈希值进行对比,如果无误则表示未被篡改.大家平常在 Windows 中都使用何种工具算校验值呢?本文向大家推荐 Windows 校验文件哈希的两种常用方式.

数据中心两种常用流量模型运用mininet的实现

编者按:在网络性能评估中一个巨大的挑战就是如何生成真实的网络流量,还好可以通过程序来创造人工的网络流量,通过建立测试环境来模拟真实的状况.本文就以数据中心网络为目标场景,来在mininet仿真环境中尽可能地还原数据中心内部的真实流量情况.目前有两种常用的流量模型: ■随机模型:主机向在网络中的另一任意主机以等概率发送数据包 ■概率模型:在网络中,编号为m的主机分别以概率Pt .Pa .Pc .向主机编号为(m+i).(m+j).(m+k)的主机发送数据包 我们使用mininet中的iperf工具

微信企业号两种常用搜索加载方式

微信企业端两种常用搜索方式 一:在搜索框中进行加载搜索结果 1.html部分代码和js部分代码 <div class="page__bd" style="height: 100%;"> <div class="weui-search-bar" id="searchBar"> <form class="weui-search-bar__form"> <div clas

【iOS开发-网络】两种常用的方法解析XML数据

解析XML数据常用的有两种方法 第一种 使用Google的GDataXMLNode解析XML数据 使用的是DOM方式解析 先把xml一口吞掉 然后一点一点的解析 第二种 使用苹果自带的NSXMLParser解析XML数据 使用的是SAX方式解析 一个标记一个标记的解析 第一种使用步骤 第一步 首先把GDataXML文件夹放入项目中 第二步 更改Bulid Setting里面的东西 更改头文件搜索路径 在Header Search Paths里面添加路径/usr/include/libxml2 在

Java学习笔记——线程两种常用的创建调用方法

这是两种开发中常用的线程使用方法,匿名对象调用即可,很简单,掌握即可 <span style="font-size:18px;">class ThreadDemo { public static void main(String[] args) { new Thread() { public void run() { //coding here } }.start(); Runnable r = new Runnable() { public void run() { //