数据存储--队列

队列:

  类似于生活中的排队购票系统,排头的人总是最先到的,也是最先取到票的。即先入先出,跟栈的后入先出是不同的。

  误区:算法里的队列并不会像生活剧中一样,排头走后,后面的跟着前移一步,队列是一种存放数据的工具,从底部开始存数据,存放一个到排尾,数据的访问权就上移一位,取出排头的一个,数据的访问权也上移一位。

  某一时刻的队列图如下:

此时的队列,只能存入两个数据,但还有三个空的单元。

更加实用的队列设计是环绕式处理。当添加数据到队列顶端时,先判断队列是否为空,然后将队尾指针循环到队列底端。

java实现:

 1 package com.test;
 2
 3 public class Test {
 4
 5     public static void main(String[] args) {
 6
 7         queue q = new queue(4);
 8         q.insert(1);
 9         q.insert(2);
10         q.insert(3);
11
12         long f = q.peekFront();
13         System.out.println("队头元素:"+f);
14
15         q.remove();
16
17         long f2 = q.peekFront();
18         System.out.println("队头元素:"+f2);
19
20
21     }
22 }
23
24 /**
25  * 队列
26  * @author jingxin
27  *
28  */
29 class queue{
30     private int maxSize;  // 队列大小
31     private long[] queArray; // 基于数组
32     private int front;  // 队头
33     private int rear;  // 队尾
34     private int nEelms; // 数组元素下标
35
36     public queue(int s){
37         maxSize = s;
38         queArray = new long[maxSize];
39         front = 0;
40         rear = -1;
41         nEelms = 0;
42     }
43
44     // 添加元素
45     public void insert(long i){
46         // 队尾已到顶了
47         if(rear==maxSize-1){
48             rear = -1;  // 队尾指针环绕到最低端
49         }
50         queArray[++rear] = i; // 指针先上移
51         nEelms++;  // 元素个数加1
52     }
53
54     // 移除元素(移除队头元素,当然也可以设计移除队尾元素)
55     public long remove(){
56         if(nEelms!=0){
57             long temp = queArray[front++];  // 移除后指针上移
58             if(front==maxSize){
59                 front = 0;
60             }
61             nEelms--;
62             return temp;
63         }else{
64             return -1;
65         }
66
67     }
68
69     // 查看队头
70     public long peekFront(){
71         return queArray[front];
72     }
73
74     public boolean isEmpty(){
75         return nEelms==0;
76     }
77
78     public boolean isFull(){
79         return nEelms == maxSize;
80     }
81
82     public int size(){
83         return nEelms;
84     }
85 }
时间: 2024-09-30 15:17:01

数据存储--队列的相关文章

数据存储的常用结构 堆栈、队列、数组、链表

数据存储的常用结构有:堆栈.队列.数组.链表.我们分别来了解一下: 堆栈,采用该结构的集合,对元素的存取有如下的特点: 先进后出(即,存进去的元素,要在后它后面的元素依次取出后,才能取出该元素).例如,子弹压进弹夹,先压进去的子弹在下面,后压进去的子弹在上面,当开枪时,先弹出上面的子弹,然后才能弹出下面的子弹. 栈的入口.出口的都是栈的顶端位置 压栈:就是存元素.即,把元素存储到栈的顶端位置,栈中已有元素依次向栈底方向移动一个位置. 弹栈:就是取元素.即,把栈的顶端位置元素取出,栈中已有元素依次

性能优化之数据存储&DOM编程

数据存储 ·在javascript中,数据存储的位置会对代码整体性能产生重大的影响. ·数据存储共有4种方式:字面量.变量.数组.对象成员. ·要理解变量的访问速度,就要理解作用域.由于局部变量处于作用域的起始位置,因此访问速度比访问跨域作用域变量(即除起始位置之外的外层作用域变量)更快.即变量处在作用域的位置越深,访问速度越慢.这也就说明,访问全局变量的速度是最慢的. 总的来说,字面量和局部变量的访问速度快于数组和对象成员的访问速度. 因此,常见的一些提高数据访问速度的方法有: ①避免使用wi

Android 数据存储方式分为哪几种?

10道题值得思考 第一道题 1.Android 数据存储方式分为哪几种? SharedPreferences存储数据 2. CotentProvider内容提供者 3. 文件存储 4. 数据库存储(Sqlite) 5.网络存储 2. NDK是什么? 1. 一系列工具类的集合 2. Arm指令集 3. NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk.这些工具对开发者的帮助是巨大的. NDK集成了交叉编译器,并提供了相应的mk文件隔离

初码-Azure系列-存储队列的使用与一个Azure小工具(蓝天助手)

初码Azure系列文章目录 将消息队列技术模型简化,并打造成更适合互联网+与敏捷开发的云服务模式,好像已经是行业趋势,阿里云也在推荐使用消息服务(HTTP协议为主)而来替代消息队列(TCP协议.MQTT协议为主),并且将消息服务纳入到了存储体系内(Azure也是,有人知道为什么吗,是因为数据持久化在了磁盘上?) 更搞笑的是,阿里云还在帮助中心贴了一个表格 真是扎心了老铁,这不是自己怼自己,逼人用消息服务吗.. 回到本文主题上来,这几天用了Azure的存储服务里面的存储队列,感觉还是非常好用的,大

Atitit 研发体系建立 数据存储与数据知识点体系知识图谱attilax 总结

分类具体知识点原理规范具体实现(oracle,mysql,mssql是否可以自己实现说明 数据库理论数据库的类型 数据库理论,网状,层次, 数据库理论树形数据库注册表,hashtable 数据库理论,kv数据库.hashtable 数据库理论Oodb 数据库理论nosql db 数据库理论隔离级别 数据库理论 数据库理论Er模型 数据库理论Acid数据库完整性 数据库理论关系模型 数据库理论   sql 数据库理论 数据库理论存储过程 数据库理论 触发器 数据库理论 视图 约束 数据库理论 数据

对比iOS中的四种数据存储

你是用什么方法来持久保存数据的?这是在几乎每一次关于iOS技术的交流或讨论都会被提到的问题,而且大家对这个问题的热情持续高涨.本文主要从概念上把“数据存储”这个问题进行剖析,并且结合各自特点和适用场景给大家提供一个选择的思路,并不详细介绍某一种方式的技术细节. 谈到数据储存,首先要明确区分两个概念,数据结构和储存方式.所谓数据结构就是数据存在的形式.除了基本的NSDictionary.NSArray和NSSet这些对象,还有更复杂的如:关系模型.对象图和属性列表多种结构.而存储方式则简单的分为两

【Android的从零单排开发日记】——Android数据存储(下)

废话不多说了,紧接着来讲数据库的操作吧.Come On! 提到数据存储问题,数据库是不得不提的.数据库是用来存储关系型数据的不二利器.Android为开发者提供了强大的数据库支持,可以用来轻松地构造基于数据库的应用.Android的数据库应用,依托于当下最流行的开源嵌入式数据库SQLite.在Android中,应用的数据库文件是该应用私有的,存储在应用数据目录下的databases子目录内.从代码结构来看,Android的数据库实现可以分成两个层次,在底层通过C++调用SQLite的接口来执行S

【Android的从零单排开发日记】之入门篇(八)——Android数据存储(下)

废话不多说了,紧接着来讲数据库的操作吧.Come On! 提到数据存储问题,数据库是不得不提的.数据库是用来存储关系型数据的不二利器.Android为开发者提供了强大的数据库支持,可以用来轻松地构造基于数据库的应用.Android的数据库应用,依托于当下最流行的开源嵌入式数据库SQLite.在Android中,应用的数据库文件是该应用私有的,存储在应用数据目录下的databases子目录内.从代码结构来看,Android的数据库实现可以分成两个层次,在底层通过C++调用SQLite的接口来执行S

Go Web:数据存储(1)——内存存储

数据可以存储在内存中.文件中.按二进制序列化存储的文件中.数据库中等. 内存存储 将数据存储到内存中.此处所指的内存是指应用程序自身的内存空间(如slice.array.map.struct.队列.树等等容器),而不是外部的内存数据库(如redis). 例如,要存储博客文章. 每篇博客文章都有文章ID.文章内容以及文章作者.假设它是一个struct结构: type Post struct { Id int Content string Author string } 为了在内存中存储每一篇Pos