栈(Stack)

  • 栈的应用 – 浏览器的前进和后退
  • 栈的接口设计
  • 动态数组实现栈
  • 练习题
    • 逆波兰表达式求值
    • 有效的括号

数据结构与算法笔记目录:《恋上数据结构》 笔记目录

想加深 Java 基础推荐看这个: Java 强化笔记目录

栈是一种特殊的线性表,只能在一端进行操作

  • 往栈中添加元素的操作,一般叫做 push入栈

  • 从栈中移除元素的操作,一般叫做 pop出栈
    (只能移除栈顶元素,也叫做:弹出栈顶元素)

  • 后进先出的原则,Last In First Out,LIFO

注意:这里说的 “栈” 与内存中的 “栈空间” 是两个不同的概念;

栈的应用 – 浏览器的前进和后退


类似的应用场景:软件的撤销(Undo)、恢复(Redo)功能

栈的接口设计

int size(); // 元素的数量
boolean isEmpty(); // 是否为空
void push(E element); // 入栈
E pop(); // 出栈
E top(); // 获取栈顶元素
void clear(); // 清空

栈的内部实现是否可以直接利用以前学过的数据结构?

  • 动态数组链表

动态数组实现栈

动态数组的知识:《恋上数据结构第1季》动态扩容数组原理及实现(Java、C++)

利用前面写的动态数组实现栈,极其简单;

package com.mj;import com.mj.list.ArrayList;
import com.mj.list.List;public class Stack <E> {private List<E> list = new ArrayList<>();public void clear(){list.clear();}public boolean isEmpty(){return list.isEmpty();}public void push(E element){list.add(element);}public E pop(){return list.remove(list.size() - 1); }public E top(){return list.get(list.size() - 1);}}

练习题

逆波兰表达式求值

150_逆波兰表达式求值:https://leetcode-cn.com/problems/evaluate-reverse-polish-notation/

class Solution {public int evalRPN(String[] tokens) {Stack<Integer> stack = new Stack<>();for (String string : tokens) {switch (string) {case "+":stack.push(stack.pop() + stack.pop());break;case "-":stack.push(-stack.pop() + stack.pop());break;case "*":stack.push(stack.pop() * stack.pop());break;case "/":Integer right = stack.pop();stack.push(stack.pop() / right);break;default:stack.push(Integer.parseInt(string));break;}}return stack.pop();}
}

有效的括号


解法1:

public boolean isValid(String s) {while(s.contains("{}") || s.contains("[]") || s.contains("()")){s.replace("{}", "");s.replace("[]", "");s.replace("()", "");}return s.isEmpty();
}

解法2:

public boolean isValid2(String s){Stack<Character> stack = new Stack<>();int len = s.length();for(int i = 0; i < len; i++){char c = s.charAt(i);if(c == '(' || c == '[' || c == '{'){ // 左括号stack.push(s.charAt(i)); // 左字符入栈}else{ // 右括号if(stack.isEmpty()) return false; // 没有左括号, 却匹配到了右括号,falsechar left = stack.pop();if(left == '(' && c != ')') return false; // 左右括号不匹配if(left == '[' && c != ']') return false; // 左右括号不匹配if(left == '{' && c != '}') return false; // 左右括号不匹配}} // 扫描完毕return stack.isEmpty();
}

解法3:

static HashMap<Character, Character> map = new HashMap<>();
static {map.put('(', ')');map.put('[', ']');map.put('{', '}');
}
public boolean isValid(String s){Stack<Character> stack = new Stack<>();int len = s.length();for(int i = 0; i < len; i++){char c = s.charAt(i); if(map.containsKey(c)){ // 左括号,哈希表中有该键则入栈stack.push(c);}else{ // 右括号if(stack.isEmpty()) return false;char left = stack.pop();if(c != map.get(left)) return false;}}return stack.isEmpty();
}

《恋上数据结构第1季》动态数组实现栈相关推荐

  1. 《恋上数据结构第1季》二叉搜索树BST

    二叉搜索树(BinarySearchTree) BST 接口设计 BST 基础 添加元素: add() 删除元素: remove() 删除节点 – 叶子节点 删除节点 – 度为1的节点 删除节点 – ...

  2. 《恋上数据结构第1季》动态扩容数组原理及实现

    动态扩容数组 什么是数据结构? 线性表 数组(Array) 动态数组(Dynamic Array) 动态数组接口设计 清除所有元素 - clear() 添加元素 - add(E element).ad ...

  3. 《恋上数据结构第1季》集合 ListSet、TreeSet、HashSet

    集合(Set) 集合的接口定义 双向链表 LinkedList 实现 ListSet 红黑树 RBTree 实现 TreeSet TreeMap 实现 TreeSet HashMap 实现 HashS ...

  4. 《恋上数据结构第1季》队列、双端队列、循环队列、循环双端队列

    队列(Queue) 队列 Queue 队列的接口设计 队列源码 双端队列 Deque 双端队列接口设计 双端队列源码 循环队列 Circle Queue 循环队列实现 索引映射封装 循环队列 – %运 ...

  5. 《恋上数据结构第1季》单向循环链表、双向循环链表以及约瑟夫环问题

    循环链表(CircleList) 链表的接口设计 单向循环链表 单向循环链表完整源码 双向循环链表 双向循环链表完整源码 双向循环链表解决约瑟夫环问题 如何发挥循环链表的最大威力? 静态链表 数据结构 ...

  6. 《恋上数据结构第1季》单向链表、双向链表

    链表(Linked List) 链表的接口设计 单向链表(SingleLinkedList) 获取元素 – get() 清空元素 – clear() 添加元素 – add(int index, E e ...

  7. 《恋上数据结构第1季》二叉堆原理及实现、最小堆解决 TOP K 问题

    二叉堆 BinaryHeap 堆(Heap) 堆的出现 堆简介 二叉堆(Binary Heap) 获取最大值 最大堆 - 添加 最大堆 - 添加优化 最大堆 - 删除 replace 最大堆 - 批量 ...

  8. 《恋上数据结构第1季》哈希表介绍以及从源码分析哈希值计算

    哈希表(Hash Table) 引出哈希表 哈希表(Hash Table) 哈希冲突(Hash Collision) JDK1.8的哈希冲突解决方案 哈希函数 如何生成 key 的哈希值 Intege ...

  9. 《恋上数据结构第1季》映射 TreeMap,HashMap,LinkedHashMap

    映射 Map Map的接口定义 Map.java 红黑树 RBTree 实现 TreeMap TreeMap 分析 哈希表实现 HashMap HashMap 升级为 LinkedHashMap 数据 ...

最新文章

  1. 三十六、请求分页管理方式
  2. 新书上市|当我们讨论“量子计算”时我们在讨论什么?
  3. CNN----卷积为何能提取图像特征
  4. Python自动化一--接口测试基础知识,jmeter操作介绍
  5. 使用程序创建数据库表
  6. MybatisPlus介绍
  7. Leveldb二三事
  8. [css] 怎么让英文单词的首字母大写?
  9. php读取操作大文件
  10. 【病毒】开机弹出“tlntsvi_6635.exe程序”解决方案
  11. [APM] 解读APM技术分类和实现方式
  12. Chelly的串串专题
  13. python和c的语法区别_python和c语言语法有什么区别?
  14. 水调歌头明月几时有赏析
  15. 数据库实验 实验三 数据查询
  16. 从0开始的视频特效制作之路
  17. 一文看懂人工智能芯片的产业生态及竞争格局
  18. 计算机组成原理 Computer Composition Principle唐朔飞 全书梳理(备忘自用 基本完结)
  19. Linux_Wget
  20. MYSQL(老杜数据库笔记)

热门文章

  1. spring-boot-route(十二)整合redis做为缓存
  2. 视频剪辑软件到底哪个功能强?容易上手并且不要钱的?
  3. android4.4安全性,[原创]Android第二代加固(support 4.4-8.1)
  4. php和asp渲染页面,Vue.js与 ASP.NET Core 服务端渲染功能
  5. SQL Server中的STRING_SPLIT函数
  6. 适合初学者的sql_适用于初学者SQL多重连接示例
  7. dbcc收缩数据库_使用DBCC SHRINKFILE收缩数据库
  8. javascript实现奥运倒计时代码
  9. ODOO v10.0 自动生成财务凭证的科目设置
  10. Linux-shell获取天气