2019独角兽企业重金招聘Python工程师标准>>>

本章涉及的三种数据存储类型:栈、队列和优先级队列。

不同类型的结构

程序员的工具

数组是已经介绍过的数据存储结构,和其他结构(链表、树等等)一样,都适用于数据应用中作数据记录。

然而,本章要讲解的是数据结构和算法更多的是作为程序员的工具来运用。它们组要作为构思算法的辅助工具,而不是完全的数据存储工具。这些数据结构的生命周期比那些数据库类型的结构要短的多。在程序操作执行期间它们才被创建,通常它们去执行某项特殊的任务,当完成之后,它们就被销毁。

受限访问

在数组中,只要知道下标就可以访问数据项。或顺序访问等。

而本章的数据结构中,访问时受限制的,即在特定时刻只有一个数据项可以被读取或者被删除(除非“作弊”);

这些结构接口的设计增强了这种受限访问。访问其他数据项(理论上)是不允许的。

更加抽象

栈、队列和优先级队列是比数组和其他数据存储结构更为抽象的结构。主要通过接口对栈、队列和优先级队列进行定义,这些接口表明通过他们可以完成的操作,而它们的主要实现机制对用户来说是不可见的。

例如,栈的主要机制可以用数组来实现,但它也可以用链表了实现。优先级队列的内部实现可以用数组或一种特别的书———堆来实现。

栈只允许访问一个数据项:即最后插入的数据项。移除这个数据项后才能访问倒数第二个插入的数据,以此类推。

栈的Java代码

public class Stack {private int maxSize;private long[] stackArray;private int top;public Stack(int s){maxSize = s;stackArray = new long[maxSize];top=-1;}public void push(long j){stackArray[++top] = j;}public long pop(){return stackArray[top--];}public long peek(){return stackArray[top];}public boolean isEmpty(){return (top==-1);}public boolean isFull(){return top==maxSize-1;}
}
public static void main(String[] args) {Stack theStack = new Stack(10);theStack.push(10);theStack.push(20);theStack.push(30);theStack.push(40);while(!theStack.isEmpty()){long value = theStack.pop();System.out.print(value);System.out.print("    ");}
}
//输出:
40  30  20  10

栈的效率

栈操作所耗的时间不依赖与栈中数据项的个数,因此操作时间很短。栈不需要比较和移动操作。

队     列

“队列”(queue)这个单词是英国人说的“排”(line)(一种等待服务的方式)。

队列是一种数据结构,有点类似栈,只是在队列中第一个插入的数据项也会最先被移除(先进先出,FIFO),而在栈中,最后插入的数据项最先移除。

队列的Java代码

public class Queue {private int maxSize;private long[] queueArray;private int front;private int rear;private int nItems;public Queue(int s){maxSize = s;queueArray = new long[maxSize];front = 0;rear = -1;nItems = 0;}public void insert(long j){if(rear == maxSize-1)rear = -1;queueArray[++rear]=j;nItems++;}public long remove(){long temp = queueArray[front++];if(front==maxSize)front = 0;nItems--;return temp;}public long peekfront(){return queueArray[front];}public boolean isEmpty(){return nItems ==0;}public boolean isFull(){return nItems == maxSize;}public int size(){return nItems;}
}
public static void main(String[] args) {Queue theQueue = new Queue(5);theQueue.insert(10);theQueue.insert(20);theQueue.insert(30);theQueue.insert(40);theQueue.remove();theQueue.remove();theQueue.remove();theQueue.insert(50);theQueue.insert(60);theQueue.insert(70);theQueue.insert(80);theQueue.insert(90);theQueue.insert(100);while(!theQueue.isEmpty()){long n = theQueue.remove();System.out.print(n);System.out.print(" ");}System.out.println("");
}

队列的效率

和栈一样,队列中插入数据项和移除数据项的时间复杂度均为O(1)。

双端队列

双端队列,就是一个两端都是结尾的队列。队列的 每一端都可以插入数据项和移除数据项。这些方法可以叫做insertLeft()和insertRight(),以及removeLeft()和removeRight()。

双端队列与栈或队列相比,是一种多用途的数据结构,在容器类库中有时会用双端队列来提供栈和队列的两种功能。但是,双端队列不像栈和队列那么常用。。。。。。。

优先级队列

优先级队列是比栈和队列更专用的数据结构。但它在很多的情况下都很有用。像普通队列一样,优先级队列有一个对头和一个队尾,并且也是从头移除数据项。不过在优先级队列中,数据项按关键字的值有序,这样关键字最小的数据项(或者在某些实现中关键字最大的数据项)总是在队头。数据项插入的时候会按照顺序插入到合适的位置以确保队列的顺序。

优先级队列Java代码

public class PriorityQueue {private int maxSize;private long[] queueArray;private int nItems;public PriorityQueue(int s){maxSize = s;queueArray = new long[maxSize];nItems = 0;}public void inser(long item) {int i;if(nItems==0)queueArray[nItems++] = item;else{for (i = nItems-1; i>=0; i--) {if(item>queueArray[i])queueArray[i+1] = queueArray[i];elsebreak;}queueArray[i+1] = item;nItems++;}}public long remove(){return queueArray[--nItems];}public long meekMin(){return queueArray[nItems-1];}public boolean isEmpty(){return nItems==0;}public boolean isFull(){return nItems==maxSize;}
}
public static void main(String[] args) {PriorityQueue queue = new PriorityQueue(5);queue.inser(30);queue.inser(50);queue.inser(10);queue.inser(40);queue.inser(20);while(!queue.isEmpty()){long item = queue.remove();System.out.print(item);System.out.print(" ");}System.out.println("");
}
//输出:10 20 30 40 50

在main()方法中随机插入5个数据项,随后移除并显示它们。最小的数据项总是最先移除,所以输出是:

10 20 30 40 50

优先级队列的效率

在本章实现的优先级队列中,插入操作需要O(N)的时间,而删除则需要O(1)的时间。

解析算术表达式

后缀表达法

日常算术表达式是将操作符(operator)(+,-,*,/)放在两个操作数(operands)(数字或代表数字的字母)之间的。因为操作符写在操作数的中间,所以把这表写法成为中缀表达法。

在后缀表达式中【也称为波兰逆序表达式(Reverse Polish Natation),或者RPN】,它是由以为波兰数学家发明的,操作符跟在两个操作数的后面。这样,A+B就成为AB+,A/B成为AB/。更复杂的如下表:

中缀表达式 后缀表达式
A+B-C AB+C-
A*B/C AB*C/
A+B*C ABC*+
A*B+C AB*C+
A*(B+C) ABC+*
A*B+C*D AB*CD*+
(A+B)*(C-D) AB+CD-*
((A+B)*C)-D AB+C*D-
A+B(C-D/(E+F)) ABCDEF+/-*+

后缀表达式求职。。。。。

小    结

  • 栈、队列和优先级队列是经常用于简化某些程序操作的数据结构。

  • 在这些数据结构中,只有一个数据项可以被访问。

  • 栈允许访问最后一个插入的数据项。

  • 栈中重要的操作是在栈顶插入(压入)一个数据项,以及从栈顶移除(弹出)一个数据项。

  • 队列只允许访问第一个插入的数据项。

  • 队列的重要操作是在队尾插入数据项和在队头移除数据项。

  • 队列可以实现为循环队列,它基于数组,数组下标可以从数组末端回绕到数组的开始位置。

  • 优先级队列允许访问最小(或者有时是最大)的数据项。

  • 优先级队列的重要操作是有序地插入新数据项和移除关键字最小的数据项。

  • 这些数据结构可以用数组实现,也可以用其他机制(例如链表)来实现。

  • 普通算术表达式是用中缀表达法表示的,这种命名的原因是操作符写在两个操作的中间。

  • 在后缀表达法中,操作符跟在两个操作数的后面。

  • 算术表达式求值通常都是先转换成后缀表达式,然后再求后缀表达式的值。

  • 在中缀表达式转换到后缀表达式以及求后缀表达式的值过程里,栈都是很有用的工具。

转载于:https://my.oschina.net/u/1431757/blog/521457

Java数据结构与算法(第四章栈和队列)相关推荐

  1. Java数据结构和算法(四)——栈

    前面我们讲解了数组,数组更多的是用来进行数据的存储,纯粹用来存储数据的数据结构,我们期望的是插入.删除和查找性能都比较好.对于无序数组,插入快,但是删除和查找都很慢,为了解决这些问题,后面我们会讲解比 ...

  2. 数据结构和算法(03)---栈和队列(c++)

    文章目录 目录 一.栈 1.栈的基本操作 2.使用C++模板类实现栈 二.队列 1.队列的基本操作 2.循环队列 **循环队列顺序存储** **循环队列链式存储** 3.双端队列 目录 数据结构: 逻 ...

  3. 2021-9-28 数据结构学习 第四章 - 栈 和 队列【1024Re】

    新学期被作业淹没,将博客晾在这太久了,不禁心生惭愧,于是将今晚本来计划去深圳湾公园散步的时间用来写文章.我在想,要写什么呢,看着案上的数据结构,就决定是你了! 看名字是第四章,我是不是错过了什么,其实 ...

  4. JAVA数据结构和算法:第一章(时间复杂度和空间复杂度)

    数据结构 数据结构基础概念 不论是哪所大学,数据结构和算法这门课都被贯上无趣.犯困.困难的标签,我们从最基础最通俗的语言去说起,保证通俗易懂. 数据结构到底是什么呢?我们先来谈谈什么叫数据. 数据:数 ...

  5. Python数据结构与算法(二)栈和队列

    本系列总结了python常用的数据结构和算法,以及一些编程实现. 参考书籍:<数据结构与算法 Python语言实现> [美]Michael T.Goodrich, Roberto Tama ...

  6. 数据结构和算法(六)栈和队列

    前言 本章带大家聊一下栈和队列 方法 1.栈的概念 栈(stack),又称堆栈,它是运算受限的线性表.其限制是仅允许在表的一端进行插入和删除操作,不允许在其他任何位置进行插入.删除.查找等操作. 表中 ...

  7. 【Java数据结构与算法】第九章 顺序查找、二分查找、插值查找和斐波那契查找

    第九章 顺序查找.二分查找.插值查找和斐波那契查找 文章目录 第九章 顺序查找.二分查找.插值查找和斐波那契查找 一.顺序查找 1.基本介绍 2.代码实现 二.二分查找 1.基本介绍 2.代码实现 三 ...

  8. 【Java数据结构与算法】第一章 稀疏数组和队列

    第一章 稀疏数组和队列 文章目录 第一章 稀疏数组和队列 一.线性结构和非线性结构 1.线性结构 2.非线性结构 二.稀疏数组 三.队列 1.队列 2.环形队列 一.线性结构和非线性结构 1.线性结构 ...

  9. 【Java数据结构与算法】第二章 单链表及简单面试题

    第二章 单链表 文章目录 第二章 单链表 一.单链表 1.基本介绍 2.思路 3.代码实现 二.简单面试题 1.求单链表中有效节点的个数 2.查找单链表中的倒数第k个节点(新浪面试题) 3.单链表的反 ...

最新文章

  1. Python2.x与3​​.x版本区别
  2. php下载七牛整个文件夹,七牛云存储文件批量下载工具 - 行客工作室
  3. 深入浅出 kvm qemu libvirt
  4. Asp.Net Core 中间件应用实战中你不知道的那些事
  5. android jni bitmap,android – 如何使用JNI位图操作来帮助避免...
  6. php imagick gif,PHP基于php_imagick_st-Q8.dll实现JPG合成GIF图片的方法
  7. WdatePicker—WdatePicker日历控件使用方法
  8. 模拟幅度调制相干解调系统抗噪声性能仿真分析
  9. lizbaka的周记
  10. 删除字符串中的元音字母
  11. 最新的计算机主板,最新主流电脑主板天梯图2020
  12. Vue项目首页_热销推荐组件、周末游组件开发
  13. C++调用ffmpeg批量合并bilibili缓存视频
  14. Unity Prefabs 预设体
  15. 使用planttml 画流程图
  16. 【STM32CubeMX安装】
  17. A + B Proble
  18. python高级语言怎么学习_Python作为近几年大热的语言,要如何学习呢?
  19. cool kickass
  20. 山东省谷歌地球高程DEM等高线下载

热门文章

  1. 暗时间:开发效率为何如此低下
  2. Linux(centOS)手动安装Apache+MySQL+PHP+Memcached+Nginx原创无错版
  3. 据说看完这21个故事的人,30岁前都成了亿万富翁。你是下一个吗?
  4. 查看CPU是i386架构和x86_64架构
  5. 提高C++性能的编程技术笔记:虚函数、返回值优化+测试代码
  6. OpenCV3.3中主成分分析(Principal Components Analysis, PCA)接口简介及使用
  7. opencv图像处理梯度边缘和角点
  8. 【C++】Google C++编码规范(三):智能指针
  9. python snmp 交换机 配置文件_编译安装SNMP,snmpd.conf配置文件说明
  10. java 全局变量 内存不回收_Java的内存 - 内存回收