队列ADT的两种简单实现

队列在书中说明的方式是两种,一种最简单的链表队列,判断情况比较简单,另一种是使用数组进行创建,限制较多,但是速度较快,也比较容易控制内存,不至于出现在链表实现上那么复杂的内存控制。

下面先是链表实现:

ListQueue.cpp

 1 #include "iostream"
 2 #include "stdlib.h"
 3
 4 typedef struct _queue_
 5 {
 6     int data;
 7     struct _queue_ *next;
 8 }queue;
 9
10 int isEmpty(queue *front)
11 {
12     if (front == nullptr)
13         return 1;
14     else
15         return 0;
16 }
17
18 void enQueue(queue *&front,queue *&rear,int data)
19 {
20     queue *p = (queue *)malloc(sizeof(queue));
21     p->data = data;
22     p->next = nullptr;
23     if (front == nullptr)
24     {
25         front = p;
26         rear = p;
27         return;
28     }
29     else
30     {
31         rear->next = p;
32         rear = p;
33         return;
34     }
35 }
36
37 void deQueue(queue *&front, queue *&rear)
38 {
39     queue *tmp=nullptr;
40     if (isEmpty(front))
41         return ;
42     if (front->next == nullptr)
43     {
44         free(front);
45         front = nullptr;
46         return;
47     }
48     else
49     {
50         tmp = front;
51         front = front->next;
52         tmp->next = nullptr;
53         free(tmp);
54         return;
55     }
56 }
57
58 int head(queue *front)
59 {
60     if (isEmpty(front))
61     {
62         std::cout << "队列为空,返回为 ";
63         return -1;
64     }
65     return front->data;
66 }
67
68 int main(void)
69 {
70     queue *front = nullptr;
71     queue *rear = nullptr;
72     enQueue(front, rear, 1);
73     enQueue(front, rear, 2);
74     enQueue(front, rear, 3);
75     enQueue(front, rear, 4);
76     enQueue(front, rear, 5);
77     std::cout << head(front) << std::endl;
78     deQueue(front, rear);
79     std::cout << head(front) << std::endl;
80     deQueue(front, rear);
81     std::cout << head(front) << std::endl;
82     deQueue(front, rear);
83     std::cout << head(front) << std::endl;
84     deQueue(front, rear);
85     std::cout << head(front) << std::endl;
86     deQueue(front, rear);
87     std::cout << head(front) << std::endl;
88     deQueue(front, rear);
89     std::cout << head(front) << std::endl;
90     system("pause");
91     return 0;
92 }

还有数组实现

ArrayQueue.cpp

  1 #include "iostream"
  2 #include "stdlib.h"
  3
  4 typedef struct _queue_
  5 {
  6     int maxSize;
  7     int front;
  8     int rear;
  9     int *Array;
 10 }queue;
 11
 12 queue *createQueue(int maxSize)
 13 {
 14     queue *p = (queue *)malloc(sizeof(queue));
 15     p->Array = (int *)malloc(sizeof(int)*maxSize);
 16     p->front = -1;
 17     p->rear = -1;
 18     p->maxSize = maxSize;
 19     return p;
 20 }
 21
 22 void enQueue(queue *q,int data)
 23 {
 24     if (q->rear == -1)
 25     {
 26         q->Array[++q->rear] = data;
 27         ++q->front;
 28     }
 29     else
 30     {
 31         if ((q->rear + 1) % q->maxSize == 0)//rear到达了数组结尾
 32         {
 33             if (q->front > 0)//数组头位置已经没有数据
 34             {
 35                 q->rear = 0;
 36                 q->Array[q->rear] = data;
 37             }
 38             else//还有数据
 39             {
 40                 std::cout << "栈已满,无法入栈" << std::endl;
 41                 return;
 42             }
 43         }
 44         else if (q->rear == q->front-1)//如果已经到了头游标的前一个位置,就是再添加也没有位置了
 45         {
 46             std::cout << "栈已满,无法入栈" << std::endl;
 47             return;
 48         }
 49         else//排除了以上两种情况后,就可以随便插入了
 50         {
 51             q->Array[++q->rear] = data;
 52         }
 53     }
 54 }
 55
 56 void deQueue(queue *q)
 57 {
 58     if (q->front == -1)
 59     {
 60         std::cout << "队列为空" << std::endl;
 61         return;
 62     }
 63     else
 64     {
 65         if ((q->front+1)%q->maxSize==0)//如果front标在结尾
 66         {
 67             if (q->front == q->rear)
 68             {
 69                 q->front = q->rear = -1;
 70             }
 71             else
 72             {
 73                 q->front = 0;
 74             }
 75         }
 76         else
 77         {
 78             if (q->front == q->rear)
 79             {
 80                 q->front = q->rear = -1;
 81             }
 82             else
 83             {
 84                 ++q->front;
 85             }
 86         }
 87     }
 88 }
 89
 90 int head(queue *q)
 91 {
 92     if (q->front == -1)
 93     {
 94         std::cout << "队列为空,返回 ";
 95         return -1;
 96     }
 97     return q->Array[q->front];
 98 }
 99
100 int main(void)
101 {
102     queue *q = createQueue(5);
103     enQueue(q, 1);
104     enQueue(q, 2);
105     enQueue(q, 3);
106     enQueue(q, 4);
107     enQueue(q, 5);
108     enQueue(q, 6);
109     deQueue(q);
110     deQueue(q);
111     deQueue(q);
112     enQueue(q, 123);
113     enQueue(q, 234);
114     std::cout << head(q) << std::endl;
115     system("pause");
116     return 0;
117 }

测试不是太过严格,如果读者发现问题,希望不吝赐教,不胜感激。

以上。

时间: 2024-08-25 05:15:56

队列ADT的两种简单实现的相关文章

java 程序执行输出有两种简单方式

java 程序执行输出有两种简单方式: 1. System.out.println("需要输出的内容"): 该方法可参看运行一个简单的Java程序 结果图: 2. System.out.print("需要输出的内容"): 1 public class HelloWorld 2 { 3 //Java程序的入口方法,程序将从这里开始运行 4 public static void main(String[] args) 5 { 6 //向控制台打印一条语句 7 Syste

两种简单实现菜单高亮显示的JS类(转载)

两种简单实现菜单高亮显示的JS类 近期在写一个博客管理后台的前端,涉及在同一页面两种高亮显示当前菜单的需求.记得当年写静态页时,为了实现高亮都是在每个页面加不同的样式,呵.高亮显示我觉得对于web前端来说,是比较常用到的效果,正好此次又要用到,特地整理出我所写的两种高亮类. 其实思路很简单,第一种方法是通过遍历链接组的href值,通过indexOf判断href值是否被包含在浏览器当前url值中.此方法有一定局限,比如对于iframe内的菜单是不能这样判断的; 第二种方法适用范围更广一样,实现思路

统计学习基础(第二版)两种简单的预测方法:最小二乘和最近邻

2.3两种简单的预测方法:最小二乘和最近邻 在本节中我们详细讨论两种简单但有效的预测方法,使用最小二乘线性模型拟合和k最近邻预测.线性模型对结构做了大量的假设,但是可能会产生不准确的预测.K-最近邻对结构做了适当的假设,所以预测通常是精确但不稳定的. 2.3.1线性模型和最小二乘 在过去的30年中,线性模型一直是统计学的支柱,而且现在依然是我们最重要的工具之一.给定一个输入向量,通过以下模型来预测Y: 其中是截距,在机器学习中又叫做偏置,通常在X中包含一个常数变量1,在系数向量中包含是方便的.这

获取验证码显示的两种简单实现,交互绝非偶然~

前面为大家讲过计时器的顺时针的两种方法,在录制视频等操作中颇有使用,今天就给大家带来倒计时实现的两种方式. 对面前面的正向计时方法没有了解的,可以直接传送门:http://www.cnblogs.com/liushilin/p/5802954.html 虽然最近写的都比较简单和基础,不过简单不代表熟悉,基础不代表就会,大牛绕过,哈,中牛小牛也可以绕过,这个是写给初学者的. 先搞个效果图. 代码实现方式也超级简单啦,这里首推第一种实现方式,而且也是比较适合大家的,就是通过直接继承CountDown

HTML5的两种简单的存储方式

1.Application Cache HTML5引入应用缓存,意味着web应用可以进行缓存,即使在没有网络的情况下也能使用. application cache有三个特点 离线浏览 已缓存的资源加载速度更快 减少服务器负载,浏览器将只从服务器下载更新过或更改过的资源 使用方法就是在 html标签中添加一个manifest属性 每个指定了 manifest 的页面在用户对其访问时都会被缓存.如果未指定 manifest 属性,则页面不会被缓存(除非在 manifest 文件中直接指定了该页面).

Gradle实现的两种简单的多渠道打包方法

Android多渠道打包Gradle多渠道打包友盟多渠道打包productFlavors 本来计划今天发Android的官方技术文档的翻译——<Gradle插件用户指南>的第五章的,不过由于昨天晚上没译完,还差几段落,所以只好推后了. 今天就说一下使用Gradle进行类似友盟这样的多渠道打包的方法吧. 本文原创,转载请注意在CSDN上的出处: http://blog.csdn.net/maosidiaoxian/article/details/42000913 目前我掌握的方法有两种,都非常简

SQL两种简单分页查询方式

以前我们或许都用过了linq的skip and take方式进行分页查询,但是很少自己写sql的分页查询,因为大多数时候,我们都是在调用别人的方法. 最近看到一个文档,感觉方法里面实现的分页查询进入数据库调用的时候,实际最底层调用的还是SQL的分页查询,例如,我们用linq写个分页查询,转成sql表达式后发现: 实际调用的时候,才发现SQL底层是这样进行分页的. 下面,本文主要是介绍两种SQL的分页查询. 一,TOP方式 ----第一种分页查询方式:TOP方式 declare @page int

C语言复制文件的两种简单的方法【从根本解决问题】

网上的方法大致有这样几种: 1.使用操作系统提供的复制文件的API 2.使用C语言本身提供的复制文件的函数 3.直接读写文件,从文件角度来操作,从而直接将一个文件复制 这里我们使用的就是这第三种. 复制文件的思路大概是这样的,如果是文本类型,则可直接使用字符读写的方式,依次读写到另一个文件中.但如果是非字符型文件那应该怎么进行操作呢?我的方法是使用二进制形式打开,然后依次针对字节进行操作,依次从文件第一个字节读写至最后一个字节实现文件的复制,那么由此可得,这种方法同样可以用在远程的操作上,即实现

重启服务器的两种简单方法简介

我们在布置服务器的时候,可能会多次重启服务器,那么我为大家推荐两个简单的方法省去繁琐的步骤:一.使用iis7服务器监控工具:然后再点击"执行"即可:二.在TXT文件中把下列代码复制并另存为bat文件,点击运行即可: cd D:\Zombies\bin taskkill /im PlatformServer.exe /f /ttaskkill /im GameServer.exe /f /ttaskkill /im LoginServer.exe /f /ttaskkill /im Lo