廖雪峰Java5集合-6Stack-1使用Stack
1.栈的定义
栈Stack是一种后进先出(LIFO: Last In First Out)的数据结构,可以看作一端封闭的容器,先进去的元素永远在底部,最后出来。
栈有2个重要的方法:
- push(E e):把元素压栈
- pop(E e):把栈顶的元素弹出
2.Qeque
用Deque可以实现Stack的功能。Deque接口有3个方法,push、pop、peek,只需要调用这3个方法就可以,不需要调用对应的addFirst、removeFirst、peekFirst。
- push(E e) : addFirst(E e)
- pop() : removeFirst()
- peek() : peekFirst()
为什么Java的集合类没有单独的Stack接口呢?
有一个遗留的class名字就叫Stack,出于兼容性的考虑,就没有创建Stack的接口了
3.Stack的作用:
3.1方法(函数)的嵌套使用
Java在处理Java方法调用的时候,就会通过栈这种数据结构来维护方法的调用层次,如通过main方法调用foo方法,foo方法调用bar方法。
static void main(String[] args) {
foo(123);
}
static String foo(int x){
return "F-" + bar(x+1);
}
static int bar(int x){
return x << 2;
}
### 3.2StackOverflowError
JVM会维护当前代码执行的栈,如果嵌套调用层次过多(如无限递归)会造成栈溢出StackOverflowError。
```#java
static void main(String[] args) {
increase(1);
}
static int increase(int x){
return increase(x)+1;
}
```
### 3.3示例:将整数转换为十六进制表示的String:12500->0x30d4
```#java
import java.util.*;
public class Main {
public static void main(String[] args) {
int x = 12500;
System.out.println(x+" 转换为十六进制字符串-->"+shang(x));
}
static String shang(Integer x){
Deque stack = new LinkedList<>();
Map map1 = new HashMap();
map1.put("10","a");
map1.put("11","b");
map1.put("12","c");
map1.put("13","d");
map1.put("14","e");
map1.put("15","f");
while(x != 0 ){
Integer result = x%16;
if (result > 9){
String index = String.valueOf(result);
String resultValue = (String) map1.get(index);
stack.push(String.valueOf(resultValue));
}else{
String resultValue = String.valueOf(result);
stack.push(String.valueOf(resultValue));
}
x = x / 16;
}
String result = "0x";
while(stack.size()>0){
result = result + stack.pop();
}
return result;
}
}
<img src="https://img2018.cnblogs.com/blog/1418970/201903/1418970-20190324170553019-943809392.png" width="500" />
### 3.4将中缀表达式编译为后缀表达式
中缀表达式:1 + 2 * (9 - 5)
后缀表达式:1 2 9 5 - * +
## 4.总结
* 栈Stack是一种后进先出的数据结构
* 操作栈的元素的方法:
* push(E e) 压栈
* pop() 出栈
* peek() 取栈顶元素但不出栈
* Java使用Deque实现栈的功能,注意只调用push/pop/peek,避免调用Deque的其他方法
* 不要使用遗留类Stack
廖雪峰Java5集合-6Stack-1使用Stack的更多相关文章
- 廖雪峰Java5集合-3Map-1使用Map
廖雪峰的视频不全,以下是疯狂Java关于Map的讲解 1.Map定义 Map是一种键值映射表,可以通过key快速查找value,同python的dict.key不允许重复,value可以重复. Map ...
- 廖雪峰Java5集合-1Java集合简介-1Java结合简介
1.集合 定义:集合就是一堆东西.集合里的东西,称为元素Element 数学中的集合: 有限集合: * 一个班所有的学生组成的集合 * 一个网站所有的商品组成的集合 无限集合: * 全体自然数集合 * ...
- 廖雪峰Java5集合-4Set-1使用Set
集合 Set用于存储不重复的元素集合: boolean add(E e) boolean remove(Object o) boolean contains(Object o) int size() ...
- 廖雪峰Java5集合-3Map-Properties的使用
Properties用于读取配置 properties文件只能使用ASCII码 #表示注释 可以从文件系统读取.properties文件 Properties props = new Properti ...
- 廖雪峰Java5集合-2List-2编写equals方法
List是一种有序链表: List内部按照放入元素的先后顺序存放 每个元素都可以通过索引确定自己的位置 boolean contains(Object o) 是否包含某个元素 int indexOf( ...
- 廖雪峰Java5集合-2List-1使用List
1.List定义 List是一种有序链表: List内部按照元素的先后顺序存放 每个元素都可以通过索引确定自己的位置 类似数组,但大小可变 //List<E>是一种有序链表: //* Li ...
- 廖雪峰Java5Java集合-5Queue-1使用Queue
Queue特性和基本方法 Queue实现一个先进先出(FIFO, First In First Out)的队列.如收银台排队支付. Java中LinkedList实现了Queue接口,可以直接把Lin ...
- Python自学笔记-递归函数(来自廖雪峰的官网Python3)
感觉廖雪峰的官网http://www.liaoxuefeng.com/里面的教程不错,所以学习一下,把需要复习的摘抄一下. 以下内容主要为了自己复习用,详细内容请登录廖雪峰的官网查看. 递归函数 ...
- 爬取廖雪峰的python3教程
从廖雪峰老师的python教程入门的,最近在看python爬虫,入手了一下 代码比较low,没有用到多线程和ip代理池 然后呢,由于robots.txt的限定,构建了一些user-agent,并放慢的 ...
随机推荐
- hdu1907 John 博弈
Little John is playing very funny game with his younger brother. There is one big box filled with M& ...
- 服务器cpu负载过高问题排查
https://blog.csdn.net/MrZhangXL/article/details/77711996 第一步 :执行top命令,查出当前机器线程情况 top - 09:14:36 up 1 ...
- linux http配置
yum install httpd 安装http服务器 启动http服务器即可访问 如果不行的话,试着执行命令 firewall-cmd –permanent –add-service=http(该命 ...
- windows知识
文章目录 系统 修改远程桌面的端口号 IE选项中reset web setting不可用(灰色)的解决办法 重装系统后,修改默认程序安装目录.我的文档.桌面 路径 Keep network addre ...
- deno学习四 docker 运行官方的一个http file server
github 上已经有人搞了一个deno 的docker 镜像,是基于源码编译的,挺好的 所以结合官方的http server demo 使用docker 运行 环境准备 docker-compose ...
- Android中控制Dialog呈现的时间
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/zinss26914/article/details/36900157 用线程控制dialog的呈现时 ...
- ubuntu 16.04卸载不必要的默认安装软件
两个办法,一个在ubuntu软件里一个一个删,明显的windows下做法. 还有一个通过终端来删除.ctrl+alt+t打开终端. 1.卸载libreoffices(要删一起删了,然后去装office ...
- 一次单片机 SFR 页引发的“事故”
一次单片机 SFR 页引发的"事故" 现象 需要使用单片机的 ADC 功能,在对 ADC 初始化后,根据内部分的 IVREN 计算出 VDD 的电压值 . 在读取时一直显示 ADC ...
- [转]kafka详解
一.入门 1.简介 Kafka is a distributed,partitioned,replicated commit logservice.它提供了类似于JMS的特性,但是在设 ...
- 【转】利用Psyco提升Python运行速度
转自:http://www.leeon.me/a/use-Psyco-to-improve-Python-speed Psyco 是严格地在 Python 运行时进行操作的.也就是说,Python 源 ...