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的更多相关文章

  1. 廖雪峰Java5集合-3Map-1使用Map

    廖雪峰的视频不全,以下是疯狂Java关于Map的讲解 1.Map定义 Map是一种键值映射表,可以通过key快速查找value,同python的dict.key不允许重复,value可以重复. Map ...

  2. 廖雪峰Java5集合-1Java集合简介-1Java结合简介

    1.集合 定义:集合就是一堆东西.集合里的东西,称为元素Element 数学中的集合: 有限集合: * 一个班所有的学生组成的集合 * 一个网站所有的商品组成的集合 无限集合: * 全体自然数集合 * ...

  3. 廖雪峰Java5集合-4Set-1使用Set

    集合 Set用于存储不重复的元素集合: boolean add(E e) boolean remove(Object o) boolean contains(Object o) int size() ...

  4. 廖雪峰Java5集合-3Map-Properties的使用

    Properties用于读取配置 properties文件只能使用ASCII码 #表示注释 可以从文件系统读取.properties文件 Properties props = new Properti ...

  5. 廖雪峰Java5集合-2List-2编写equals方法

    List是一种有序链表: List内部按照放入元素的先后顺序存放 每个元素都可以通过索引确定自己的位置 boolean contains(Object o) 是否包含某个元素 int indexOf( ...

  6. 廖雪峰Java5集合-2List-1使用List

    1.List定义 List是一种有序链表: List内部按照元素的先后顺序存放 每个元素都可以通过索引确定自己的位置 类似数组,但大小可变 //List<E>是一种有序链表: //* Li ...

  7. 廖雪峰Java5Java集合-5Queue-1使用Queue

    Queue特性和基本方法 Queue实现一个先进先出(FIFO, First In First Out)的队列.如收银台排队支付. Java中LinkedList实现了Queue接口,可以直接把Lin ...

  8. Python自学笔记-递归函数(来自廖雪峰的官网Python3)

    感觉廖雪峰的官网http://www.liaoxuefeng.com/里面的教程不错,所以学习一下,把需要复习的摘抄一下. 以下内容主要为了自己复习用,详细内容请登录廖雪峰的官网查看.   递归函数 ...

  9. 爬取廖雪峰的python3教程

    从廖雪峰老师的python教程入门的,最近在看python爬虫,入手了一下 代码比较low,没有用到多线程和ip代理池 然后呢,由于robots.txt的限定,构建了一些user-agent,并放慢的 ...

随机推荐

  1. django BBS project login登录功能实现

    1.models from django.db import models # Create your models here. from django.contrib.auth.models imp ...

  2. PostgreSQL的目录结构及修改数据目录

    initdb 的时候会指定一个 PGDATA 目录,这就是 PostgresQL 存储数据的地方,比如:/var/lib/pgsql/10/data.======显示数据目录1. 进入psqlsudo ...

  3. (22)bootstrap 初识 + Font Awesome(字体图标库)

    bootstrap作用就是简化布局 bootstrap是基于JQ的,所以内部代码使用的是jq语法 所以要使用bs,必须先倒入 1.head标签内倒入bs的css文件  <link rel=&qu ...

  4. c的动态内存管理

    在linux系统下使用malloc提示警告,解决方法,加入头文件<stdlib.h> 首先来个基本的例子 int *p=(int *)malloc(sizeof(int));(当mallo ...

  5. sqler sql 转rest api 数据校验的处理

    早期版本(2.0 之前)使用rules 进行数据校验处理,2.0 之后进行了修改使用 validators,这样更加明确 参考格式   addpost {    // if any rule retu ...

  6. elastic 部分更新 retry_on_conflict 和 数据库写锁 详细比对

    1 数据库的  update 在修改这条数据的的过程中(这个过程指的是 数据库执行update 到 事务提交的过程中 )为这条数据加上 写锁,阻止 别的事务 对锁定数据的修改,请求后一个修改事务的线程 ...

  7. php+js实现重定向跳转并post传参

    页面重定向跳转并post传参 $mdata=json_encode($mdata);//如果是字符串无需使用json echo " <form style='display:none; ...

  8. 2、Sql-oracle创建新用户

    1.首先我们可以用scott用户以sysdba的身份登录oracle. conn scott/tiger as sysdba 2.然后我就可以来创建用户了. create user zs identi ...

  9. linux od命令详解

    Linux od命令 Linux od命令用于输出文件内容.od指令会读取所给予的文件的内容,并将其内容以八进制字码呈现出来 将指定文件以八进制形式(默认)转储到标准输出.如果指定了多于一个的文件参数 ...

  10. [转]Python中yield的解释

    转自: http://python.jobbole.com/83610/ 本文作者: 伯乐在线 - wklken .未经作者许可,禁止转载!欢迎加入伯乐在线 专栏作者. 翻译 来源于stackover ...