廖雪峰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,并放慢的 ...
随机推荐
- setjmp与longjmp非局部跳转函数的使用
[root@bogon code]# cat c.c #include<stdio.h> #include<setjmp.h> static jmp_buf env;//定义全 ...
- Java中的包学习笔记
一.总结 1.引入包的概念的原因和包的作用比如有多个人开发一个大型程序,A定义了一个Math.java类,B也定义了一个Math.java类,它们放在不同目录,使用的时候也是用目录来区分,包实际上就是 ...
- MySQL Disk--SSD和HDD的性能
========================================================= 机械硬盘的性能 7200转/分的STAT硬盘平均物理寻道时间是9ms 10000转/ ...
- deno学习四 docker 运行官方的一个http file server
github 上已经有人搞了一个deno 的docker 镜像,是基于源码编译的,挺好的 所以结合官方的http server demo 使用docker 运行 环境准备 docker-compose ...
- zsh:no matches found 问题解决
解决方法: ~/.zshrc 文件加入: setopt no_nomatch 之后,更新配置 source ~/.zshrc
- 算法设计与分析基础 (Anany Levitin 著)
第1章 绪论 1.1 什么是算法 1.2 算法问题求解基础 1.2.1 理解问题 1.2.2 了解计算设备的性能 1.2.3 在精确解法和近似解法之间做出选择 1.2.4 算法的设计技术 1.2.5 ...
- MySQL 遇到错误集锦
MySQL 规定:varchar必须指定长度,否则报错:ERROR 1064 (42000) 只有一列时,primary key 直接写在这一列的后面: 没有定义主键时,提示错误:ERROR 1075 ...
- node api 之:fs
fs.readFile() 函数会缓存整个文件. 为了最小化内存占用,尽可能优先使用 fs.createReadStream().
- 高级openg 混合,一个完整程序
1.当片段着色器处理完一个片段之后,模板测试(stencil test)会开始执行,和深度测试一样,它也可能会丢弃片段,接下来,被保留的片段会进入深度测试2.每个窗口库都需要为你配置一个模板缓冲,但是 ...
- C166-变量和函数指定物理地址一
1.函数指定地址 按照http://www.keil.com/support/docs/2215.htm C166: LOCATING PROGRAM SECTIONS TO SPECIAL MEMO ...