《恋上数据结构第1季》动态数组实现栈
栈(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季》二叉搜索树BST
二叉搜索树(BinarySearchTree) BST 接口设计 BST 基础 添加元素: add() 删除元素: remove() 删除节点 – 叶子节点 删除节点 – 度为1的节点 删除节点 – ...
- 《恋上数据结构第1季》动态扩容数组原理及实现
动态扩容数组 什么是数据结构? 线性表 数组(Array) 动态数组(Dynamic Array) 动态数组接口设计 清除所有元素 - clear() 添加元素 - add(E element).ad ...
- 《恋上数据结构第1季》集合 ListSet、TreeSet、HashSet
集合(Set) 集合的接口定义 双向链表 LinkedList 实现 ListSet 红黑树 RBTree 实现 TreeSet TreeMap 实现 TreeSet HashMap 实现 HashS ...
- 《恋上数据结构第1季》队列、双端队列、循环队列、循环双端队列
队列(Queue) 队列 Queue 队列的接口设计 队列源码 双端队列 Deque 双端队列接口设计 双端队列源码 循环队列 Circle Queue 循环队列实现 索引映射封装 循环队列 – %运 ...
- 《恋上数据结构第1季》单向循环链表、双向循环链表以及约瑟夫环问题
循环链表(CircleList) 链表的接口设计 单向循环链表 单向循环链表完整源码 双向循环链表 双向循环链表完整源码 双向循环链表解决约瑟夫环问题 如何发挥循环链表的最大威力? 静态链表 数据结构 ...
- 《恋上数据结构第1季》单向链表、双向链表
链表(Linked List) 链表的接口设计 单向链表(SingleLinkedList) 获取元素 – get() 清空元素 – clear() 添加元素 – add(int index, E e ...
- 《恋上数据结构第1季》二叉堆原理及实现、最小堆解决 TOP K 问题
二叉堆 BinaryHeap 堆(Heap) 堆的出现 堆简介 二叉堆(Binary Heap) 获取最大值 最大堆 - 添加 最大堆 - 添加优化 最大堆 - 删除 replace 最大堆 - 批量 ...
- 《恋上数据结构第1季》哈希表介绍以及从源码分析哈希值计算
哈希表(Hash Table) 引出哈希表 哈希表(Hash Table) 哈希冲突(Hash Collision) JDK1.8的哈希冲突解决方案 哈希函数 如何生成 key 的哈希值 Intege ...
- 《恋上数据结构第1季》映射 TreeMap,HashMap,LinkedHashMap
映射 Map Map的接口定义 Map.java 红黑树 RBTree 实现 TreeMap TreeMap 分析 哈希表实现 HashMap HashMap 升级为 LinkedHashMap 数据 ...
最新文章
- 三十六、请求分页管理方式
- 新书上市|当我们讨论“量子计算”时我们在讨论什么?
- CNN----卷积为何能提取图像特征
- Python自动化一--接口测试基础知识,jmeter操作介绍
- 使用程序创建数据库表
- MybatisPlus介绍
- Leveldb二三事
- [css] 怎么让英文单词的首字母大写?
- php读取操作大文件
- 【病毒】开机弹出“tlntsvi_6635.exe程序”解决方案
- [APM] 解读APM技术分类和实现方式
- Chelly的串串专题
- python和c的语法区别_python和c语言语法有什么区别?
- 水调歌头明月几时有赏析
- 数据库实验 实验三 数据查询
- 从0开始的视频特效制作之路
- 一文看懂人工智能芯片的产业生态及竞争格局
- 计算机组成原理 Computer Composition Principle唐朔飞 全书梳理(备忘自用 基本完结)
- Linux_Wget
- MYSQL(老杜数据库笔记)
热门文章
- spring-boot-route(十二)整合redis做为缓存
- 视频剪辑软件到底哪个功能强?容易上手并且不要钱的?
- android4.4安全性,[原创]Android第二代加固(support 4.4-8.1)
- php和asp渲染页面,Vue.js与 ASP.NET Core 服务端渲染功能
- SQL Server中的STRING_SPLIT函数
- 适合初学者的sql_适用于初学者SQL多重连接示例
- dbcc收缩数据库_使用DBCC SHRINKFILE收缩数据库
- javascript实现奥运倒计时代码
- ODOO v10.0 自动生成财务凭证的科目设置
- Linux-shell获取天气