当前位置: 首页 > 编程日记 > 正文

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

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


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

不同类型的结构

程序员的工具

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

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

受限访问

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

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

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

更加抽象

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

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


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

栈的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-CAB+C-
A*B/CAB*C/
A+B*CABC*+
A*B+CAB*C+
A*(B+C)ABC+*
A*B+C*DAB*CD*+
(A+B)*(C-D)AB+CD-*
((A+B)*C)-DAB+C*D-
A+B(C-D/(E+F))ABCDEF+/-*+

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

小    结

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

相关文章:

可构建AI的「AI」诞生:几分之一秒内,就能预测新网络的参数

‍‍来源 | 学术头条人工智能在很大程度上是一场数字游戏。当深度神经网络在 10 年前开始超越传统算法,是因为我们终于有了足够的数据和处理能力来充分利用它们。今天的神经网络更依赖于数据和算力。训练网络时,需要仔细调整表征网络的数百万甚至数十亿参…

It is not safe to rely on the system's timezone settings

在写php程序中有时会出现这样的警告: PHP Warning: date(): It is not safe to rely on the systems timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those metho…

.NET MVC+ EF+LINQ 多表联查VIEW显示列表

1.VIEW 页面显示代码 <link href"~/Content/bootstrap.css" rel"stylesheet" /><div class"well"><table class"table"><tr><th>用户名</th><th>地址</th><th>订单编号</th…

从奥运订票系统说起——谈FastCGI 与IT 架构

2008年&#xff0c;对于首都人民来说&#xff0c;没有什么比奥运会更大的事情了。如何买到一张称心如意的比赛门票&#xff0c;也成了很多人的一个梦想。然而&#xff0c;在奥运官网抢票购买的时候&#xff0c;这个梦想却轻易地被网上购票系统的当机击成碎片&#xff0c;很多充…

【哲学百科】文艺复兴及唯理主义时期(公元1500~公元1750)

我为达目的&#xff0c;不择手段-尼古拉.马基雅维利要令习惯于君主统治的民众保有自由是一件多么困难的事情。马基雅维利的观点之一是君主不应受到道德标准的束缚&#xff0c;而应竭尽所能保全自身的荣耀以及所统治的城邦的胜利与繁荣&#xff0c;这种做法随后被人们归为现实主…

如何用 OpenGL 绘制雪花?

作者 | 许向武 责编 | 张红月出品 | CSDN博客看冬奥才知道&#xff0c;阿勒泰不但是中国的“雪都”&#xff0c;还是“人类滑雪起源地”。这个说法是否成立&#xff0c;姑且不论&#xff0c;阿勒泰的雪的确很漂亮。冬奥会有一个宣传片&#xff0c;就是借用一朵阿勒泰雪花…

面试之Hashtable和ConcurrentHashMap

那么要如何保证HashMap的线程安全呢&#xff1f; 方法有很多&#xff0c;比如使用Hashtable或者Collections.synchronizedMap&#xff0c;但是这两位选手都有一个共同的问题&#xff1a;性能。因为不管是读还是写操作&#xff0c;他们都会给整个集合上锁&#xff0c;导致同一时…

PHP动态编译出现Cannot find autoconf

在安装完PHP后,想动态编译PHP的memcache扩展库 cd memcache-2.2.5//usr/local/webserver/php/bin/phpize./configure --with-php-config/usr/local/webserver/php/bin/php-config 但是执行/usr/local/webserver/php/bin/phpize时出现错误:Configuring for:PHP Api Version: …

AnimeGANv2 实现动漫风格迁移,简单操作

作者 | Yunlord出品 | CSDN博客前言之前一直在研究如何将图像动漫化&#xff0c;尝试了阿里云api和百度api&#xff0c;效果都不尽如人意。结果发现了一个宝藏github项目——AnimeGANv2&#xff0c;能够将现实世界场景照片进行动漫风格化。可以看出AnimeGAN的效果非常好&#x…

C#调用win32 api程序实例

1、声明static extern 方法&#xff0c;使用DllImport特性 class MyClass{[DllImport("kernel32", SetLastError true)]public static extern int GetCurrentDirectory(int a, StringBuilder b);} 2、调用 StringBuilder sbnew StringBuilder {Length 250}; MyClas…

Python 之 pip拒绝访问

起因 在我使用pip安装第三方库的时候&#xff0c;控制台提示我升级pip版本 You are using pip version 9.0.1, however version 10.0.1 is available. You should consider upgrading via the python -m pip install --upgrade pip command. 很显然&#xff0c;需要使用这样的指…

Unix / 类 Unix shell 中有哪些很酷很冷门很少用很有用的命令?(转)

著作权归作者所有。 商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 作者&#xff1a;孙立伟 链接&#xff1a;http://www.zhihu.com/question/20140085/answer/14107336 来源&#xff1a;知乎 这个问题quora上有人提过 What are some lesser known but useful…

干货满满的 Python 实战项目,点赞收藏

作者 | 俊欣来源 | 关于数据分析与可视化今天小编来给大家介绍3个干货满满的计算机视觉方向的Python实战项目&#xff0c;主要用到的库有opencv-pythonnumpypillow要是大家所配置的环境当中没有这几个模块的话&#xff0c;就需要先用pip命令下载安装pip install opencv-python …

php安装完成以后要复制php.ini文件

直接 #find / -name "php.ini" 找不到&#xff0c;是因为安装php的时候没有复制配置文件 php版本变化以后ini文件名有变 php.ini-production对应于php.ini-recommended php.ini-development对应于php.ini-dist二者差异&#xff1f; 由于版本更新,这些文件有了新的命…

MASQUERADE --random 端口不随机

iptables -t nat -A POSTROUTING -o xxxx -j MASQUERADE --random发现源端口并不是随机的而是有规律递增&#xff0c;经过Google的搜索查找&#xff0c;发现新的版本有--random-full 这个参数iptables -t nat -A POSTROUTING -o xxxx -j MASQUERADE --random-full经过测试端口随…

PHP安装与使用VLD查看opcode代码【PHP安装第三方扩展的方法】

需要分析PHP代码的性能&#xff0c;或者说实现同样功能的代码到底哪个更好呢&#xff1f;或者说想知道底层的实现可以使用VLD查看opcode 下载与安装VLD # wget http://pecl.php.net/get/vld-0.11.2.tgz# tar zxvf vld-0.11.2.tgz# cd ./vld-0.11.2# /usr/local/php/bin/phpize …

实现数组字符串翻转的两种方法

//第一种方法&#xff1a;递归法 #include <stdio.h> int reverse_string(char * string) {if (*string ! \0){reverse_string(string1);printf("%c", *string);} } int main() {char *string "abcde";printf("源字符串为&#xff1a;%s\n&quo…

详解 Python 如何将爬取到的数据分别存储到 txt、excel、mysql 中!

作者 | 黄伟呢来源 | 数据分析与统计学之美1. 页面分析我爬取的页面是腾讯体育&#xff0c;链接如下&#xff1a;https://nba.stats.qq.com/player/list.htm观察上图&#xff1a;左边展示的分别是NBA的30支球队&#xff0c;右边就是每只球队对应球员的详细信息。此时思路就很清…

蹭了BCH热度,还来诋毁BCH,这些跳梁小丑到底在玩什么阴谋?

最近一些分叉币为了博眼球简直什么招数都用。有的某分叉币对主链暂停10天的问题闭口不提&#xff0c;靠微博撕逼来吸引关注&#xff0c;有的则自导自演了一出51%***的大戏。而奇怪的是当别人开始谈论他们这些错误的时候&#xff0c;他们却把矛头指向了火热的比特币现金。这些跳…

比 GPT-3 更擅长理解用户意图,OpenAI发布 InstructGPT

作者 | 青苹果来源 | 数据实战派近日&#xff0c;OpenAI 发布了一项令人瞩目的研究—— InstructGPT。在这项研究中&#xff0c;相比 GPT-3 而言&#xff0c;OpenAI 采用对齐研究&#xff08;alignment research&#xff09;&#xff0c;训练出更真实、更无害&#xff0c;而且更…

The C10K problem原文翻译

原文地址&#xff1a;http://www.cnblogs.com/fll/archive/2008/05/17/1201540.htmlThe C10K problem如今的web服务器需要同时处理一万个以上的客户端了&#xff0c;难道不是吗&#xff1f;毕竟如今的网络是个big place了。 现在的计算机也很强大了&#xff0c;你只需要花大概$…

mysql中模糊查询的四种用法介绍

下面介绍mysql中模糊查询的四种用法&#xff1a; 1&#xff0c;%&#xff1a;表示任意0个或多个字符。可匹配任意类型和长度的字符&#xff0c;有些情况下若是中文&#xff0c;请使用两个百分号&#xff08;%%&#xff09;表示。 比如 SELECT * FROM [user] WHERE u_name LIKE …

spring data jpa 详解

2019独角兽企业重金招聘Python工程师标准>>> 本篇进行Spring-data-jpa的介绍&#xff0c;几乎涵盖该框架的所有方面&#xff0c;在日常的开发当中&#xff0c;基本上能满足所有需求。这里不讲解JPA和Spring-data-jpa单独使用&#xff0c;所有的内容都是在和Spring整…

php使用curl可以get 模拟post

本机windows测试需要打开curl php.ini extensionphp_curl.dll重启apacheinclude (Curl.php);$cunew QP_Curl_Curl();$s$cu->get(http://www.baidu.com);echo $s;Curl.php可以使用http://www.myquickphp.com/的框架中的组件Curl.php/*** CURL 工具* * category QuickPHP(II…

为什么使用模块?

# -*- coding: utf-8 -*- #python 27 #xiaodeng #模块01#每个文件都是一个模块&#xff0c;并且模块导入之后就可以导入模块定义的变量名。#为什么使用模块&#xff1f; #命名空间提供了将部件组织为系统的简单的方法。 #在一个模块文件的顶层定义的所有变量名都成了被导入的模…

报告!插件×元宵来啦

欢欢喜喜 闹元宵迈过新年&#xff0c;开工大吉&#xff0c;元宵节的脚步悄悄靠近&#xff0c;在大家努力搬砖得同时&#xff0c;CSDN插件带着它的元宵活动走来啦~元宵喜乐汇虎年的第一个月圆之夜&#xff0c;除了吃汤圆还能干啥呢&#xff1f;当然是猜灯谜咯&#xff01;CSDN插…

%f%g%e区别

%f 表示按浮点数的格式输出 %e 表示按指数形式的浮点数的格式输出 %g 表示自动选择合适的表示法输出&#xff0c;可以去小数末尾多余的0转载于:https://www.cnblogs.com/holyday/p/9111777.html

Cassandra安装测试

说明&#xff0c;本人成功安装过程记录 只要看解压目录的readme.txt即可&#xff0c;其他网上教程由于版本不对会执行报错&#xff0c;例如遇到编码问题 #wget http://www.apache.org/dyn/closer.cgi?path/cassandra/1.0.3/apache-cassandra-1.0.3-bin.tar.gz #tar -zxvf a…

如何使用 Python 隐藏图像中的数据

作者 | 小白来源 | 小白学视觉隐写术是在任何文件中隐藏秘密数据的艺术。秘密数据可以是任何格式的数据&#xff0c;如文本甚至文件。简而言之&#xff0c;隐写术的主要目的是隐藏任何文件&#xff08;通常是图像、音频或视频&#xff09;中的预期信息&#xff0c;而不实际改变…

php 的 危 险 参 数

hpinfo() 功能描述&#xff1a;输出 PHP 环境信息以及相关的模块、WEB 环境等信息。 危险等级&#xff1a;中 passthru() 功能描述&#xff1a;允许执行一个外部程序并回显输出&#xff0c;类似于 exec()。 危险等级&#xff1a;高 exec() 功能描述&#xff1a;允许执行一个外部…