数据结构和算法(五)–栈(Stack)

什么是栈

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

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

  • 往栈中移除元素,一般叫做pop,弹栈/出栈(只能移除栈顶元素)

  • 栈遵循后进先出原则,Last In First Out,LIFO

  • 注意:这里所说的“栈”和内存中的“栈空间”是两个不同的慨念,不能混为一谈

栈的接口设计

  • int size();
    获取长度
  • boolean isEmpty();
    判断是否为空
  • void push(E e);
    入栈,把元素存入栈中
  • E pop();
    弹栈,出栈,返回并移除栈顶元素
  • E top();
    获取栈顶元素

栈的代码实现

  • 栈可以用之前学过的数据结构(List)来实现
  • CustomLinkedList请看 《数据结构和算法(二)–单向(循环)链表(LinkedList)》
/*** @author maolin yuan* @version 1.0* @date 2021/5/31 13:29*/
public class CustomStack<E> {private final CustomLinkedList<E> STACK = new CustomLinkedList<>();public int size(){return STACK.size();}public boolean isEmpty(){return size() == 0;}public void push(E e){STACK.add(e);}public E pop(){if (isEmpty()){throw new RuntimeException("stack not have element");}return STACK.remove(STACK.size() - 1);}public E top(){if (isEmpty()){return null;}return STACK.get(STACK.size() - 1);}public static void main(String[] args) {CustomStack<Integer> stack = new CustomStack<>();System.out.println(stack.size());System.out.println(stack.isEmpty());System.out.println(stack.top());try {System.out.println(stack.pop());}catch (Exception e){System.out.println(e.getMessage());}for (int i = 0; i < 100; i++) {stack.push(i);System.out.println(stack.size());}System.out.println("========");while (!stack.isEmpty()){System.out.println(stack.pop());}}}

练习

1.有效括号
  • 链接:https://leetcode-cn.com/problems/valid-parentheses/
  • 思路:遍历字符串,遇到左括号就入栈,遇到右括号就弹栈出来和此括号进行对比,当所有都匹配数量也对的上则所有括号都有效
  • 代码实现:
class Solution {public boolean isValid(String s) {Stack<Character> characters = new Stack<>();char[] chars = new char[s.length()];s.getChars(0,s.length(),chars,0);for (char c: chars) {if (c == '(' || c == '{' || c == '['){characters.push(c);}else if (c == ')' || c == '}' || c == ']'){if (characters.isEmpty()){return false;}Character pop = characters.pop();if ((pop == '(' && c != ')') || (pop == '{' && c != '}') || (pop == '[' && c != ']')){return false;}}}return characters.isEmpty();}
}

数据结构和算法(五)--栈(Stack)相关推荐

  1. 数据结构与算法之栈入门题目

    数据结构与算法之栈题目 目录 用数组实现大小固定的队列和栈 实现一个特殊的栈,在实现栈的基础功能上,再实现返回栈中最小元素的操作 如果仅用栈结构实现队列结构和如何仅用队列结构实现栈结构 1. 用数组实 ...

  2. 数据结构与算法--简单栈实现及其应用

    栈 栈(Stack)是一种限制插入和删除只能在一个位置上进行的表,改位置是表的末端,叫做栈顶top.栈的基本操作有push (进栈)pop(出栈) 栈又叫做LIFO(后进先出)表,下图展示普通push ...

  3. C++数据结构和算法2 栈 双端/队列 冒泡选择插入归并快排 二三分查找 二叉树 二叉搜索树 贪婪 分治 动态规划

    C++数据结构和算法2 栈 双端/队列 冒泡选择插入归并快排 二三分查找 二叉树 二叉搜索树 贪婪 分治 动态规划 博文末尾支持二维码赞赏哦 _ github 章3 Stack栈 和 队列Queue= ...

  4. 数据结构与算法五:哈希表-哈希函数设计原则-哈希冲突解决方案

    一.哈希表的定义: 二.哈希表举例: 哈希函数就是映射关系 三.哈希表应用举例: Leetcode上第387题: 思路:通过s.charAt(i)-'a'将字符串中的字符映射成hash表,出现一次,在 ...

  5. 数据结构与算法--利用栈实现队列

    利用栈实现队列 上一节中说明了栈的特点 后进先出,我们用数组的方式实现了栈的基本操作api,因此我们对栈的操作是不考虑排序的,每个api的操作基本都是O(1)的世界,因为不考虑顺序,所以找最大,最小值 ...

  6. 新星计划Day7【数据结构与算法】 栈Part1

    新星计划Day7[数据结构与算法] 栈Part1

  7. java stack 从1.5开始?_java数据结构与算法之栈(Stack)设计与实现

    本篇是java数据结构与算法的第4篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 栈是一种用于存储数据的简单数据结构,有点类似链表或者顺序表(统称线性表),栈与线 ...

  8. 数据结构与算法之-----栈(Stack)

    [ 写在前面的话:本专栏的主要内容:数据结构与算法. 1.对于​​​​​​​初识数据结构的小伙伴们,鉴于后面的数据结构的构建会使用到专栏前面的内容,包括具体数据结构的应用,所使用到的数据结构,也是自己 ...

  9. 数据结构与算法(2)——栈和队列

    前言:题图无关,只是好看,接下来就来复习一下栈和队列的相关知识 前序文章: 数据结构与算法(1)--数组与链表(https://www.jianshu.com/p/7b93b3570875) 栈 什么 ...

  10. 【数据结构与算法】栈与队列

    栈 一.什么是栈? 1.后进者先出,先进者后出,这就是典型的"栈"结构. 2.从栈的操作特性来看,是一种"操作受限"的线性表,只允许在端插入和删除数据. 二.为 ...

最新文章

  1. 0011_练习题d1
  2. kimsoft-jscalendar 简介
  3. python中print用法
  4. Intel Realsense D435 获取摄像头option参数值 get_option()
  5. python计算AA制时砍价后大家需要分摊的钱
  6. java删除mysql 数据库语句怎么写_怎么用JAVA语句在Mysql中查询,添加,删除语句,说的详细点,谢谢!...
  7. DCOS Virtual Networks
  8. 基于BP神经网络和ORL库的人脸识别matlab仿真
  9. 面试|2021 菜鸟金三银四铜五 Android 被锤历程出炉...
  10. 国内的一个不错的ftp搜索引擎
  11. 学习数码相框1.2.0.0字符的编码方式_显示点阵文字_freetype_在PC上测试freetype
  12. python绘制折线图显示点数据_Python_散点图与折线图绘制
  13. 5G无线网络CU/DU分离架构
  14. GameFi 在宏观趋势上出现下滑,但个别项目却大放异彩| April Monthly Report
  15. Kubernetes学习之污点
  16. 中译英提升:准译员如何“假装”自己很地道?丨打死个翻译官2.4
  17. 多目标跟踪 TAO 数据集使用方法分享
  18. Unity中的警告--warning CS0108:'XXXX' hides inherited member 'AAAAA'. Use...的原因以及解决办法
  19. vmwaretools与open-vm-tools都无法使用的解决方法
  20. 二流学校的计算机博士,二流大学-复旦大学计算机科学技术学院博士生刘鹏飞荣获2016年度百度奖学金...

热门文章

  1. i510400和i512400差距
  2. 今天看漫画不爽,操起ruby...
  3. 一图了解交通拥堵治理措施
  4. with recursive用法
  5. Java工程师培训课(十一、新的开始)
  6. java编程——案例1:模拟购物车
  7. 公司金融02.净现值与内部收益率
  8. 数据开发面试问题记录
  9. 高一数学知识点:逻辑联结词、全称量词与存在量词
  10. 服务端没有 listen,客户端发起连接建立,会发生什么?