一、栈的简介

定义

  栈(英语:stack)又称为堆栈或堆叠,栈作为一种数据结构,它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。

  由于堆叠数据结构只允许在一端进行操作,因而按照后进先出(LIFO == Last In First Out)的原理运作。栈也称为后进先出

栈的应用场景

  undo操作(撤销)

    例如:将操作的每组数据存入栈中,如果想要撤销,只需要弹出栈顶元素,就可以恢复上一步操作了。

  程序调用的系统栈

    例如:A方法调用B方法得到返回值,B调用C得到返回值,A操作走到了B方法,这个时候可以将A的代码位置存储到栈中,然后走到B方法,B操作走到了C方法,这个时候可以将B的代码位置存储到栈中。最后C执行完成,根据栈的结构开始弹出数据,一步一步再走回A方法。

  判断括号是否有效。下文会有代码实现(详细规则描述可以参考leetcode第20题)

    开括号必须用同一类型的括号闭合。

    开方括号必须按正确顺序闭合。

    例如:正确的:{[()]} {()} 等 。错误的:[{(})] [}{()] 等。

  自定义栈基类的代码实现

    栈在java.util有一个工具类,先不用,自定义实现一个

二、自定义栈-代码

1. 创建一个接口,统一规范栈的实现

public interface Stack<E>{
// 向栈插入元素
public void push(E e); //取出最上面的元素,并且返回
public E pop(); //获取栈的大小
public int getSize(); //判断栈是否为空
public boolean isEmpty(); //获取栈最上面的元素
public E peek();
}

2. 基于数组实现栈

import com.wj.queue.ArrayUtil;
//数组实现栈
public class ArrayStack<E> implements Stack<E> { private Array<E> array; //Array:https://www.cnblogs.com/FondWang/p/11806545.html public ArrayStack(int capacity){
array = new Array<>(capacity);
} public ArrayStack(){
array = new Array<E>();
}
@Override
public int getSize() {
return array.getSize();
} @Override
public boolean isEmpty() {
return array.isEmpty();
} @Override
public void push(E o) {
array.addFirst(o);
} @Override
public E pop() {
return array.removeFirst();
} @Override
public E peek() {
return array.getFirst();
} @Override
public String toString() {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("Stack: ");
stringBuilder.append('[');
for (int i = 0; i<array.getSize(); i++){
stringBuilder.append(array.get(i));
if (i != array.getSize()-1){
stringBuilder.append(",");
}
}
stringBuilder.append("] top");
return stringBuilder.toString();
}
}

测试代码

public class StackTest {
  public static void main(String[] args) {
  ArrayStack<Integer> arrayStack = new ArrayStack();
  for (int i=0; i< 10; i++){
   arrayStack.push(i);
   System.out.println(arrayStack);
  }
  Integer pop = arrayStack.pop();
  System.out.println("移除的内容是:" + pop);
  System.out.println("移除后的arrayStack: " + arrayStack);
  }
}
//测试结果
Stack: [0] top
Stack: [1,0] top
Stack: [2,1,0] top
Stack: [3,2,1,0] top
Stack: [4,3,2,1,0] top
Stack: [5,4,3,2,1,0] top
Stack: [6,5,4,3,2,1,0] top
Stack: [7,6,5,4,3,2,1,0] top
Stack: [8,7,6,5,4,3,2,1,0] top
Stack: [9,8,7,6,5,4,3,2,1,0] top
移除的内容是:9
移除后的arrayStack: Stack: [8,7,6,5,4,3,2,1,0] top

相关栈的应用代码

leetCode第20题,花括号正确闭合

思路:

  • 根据栈的数据结构特点,我们可以先将所有左括号‘[{(’放进栈中,然后判断当前字符如果是‘)]}’这种的右括号,但是栈顶的括号却不匹配,返回false
  • 注意控制判断
  • 这里使用java自带的栈工具类来实现

代码实现:

public class Solution {
public static void main(String[] args) {
Solution solution = new Solution();
System.out.println(solution.isValid("{[]()}"));
}
public boolean isValid(String s) {
Stack<Character> characters = new Stack<>();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c == '{' || c == '[' || c == '(') {
characters.push(c);
} else {
if(characters.isEmpty()){
return false;
}
Character peek = characters.pop();
switch (c) {
case '}':
if (!peek.equals('{')) {
return false;
}
continue;
case ']':
if (!peek.equals('[')) {
return false;
}
continue;
case ')':
if (!peek.equals('(')) {
return false;
}
continue;
}
}
}
return characters.isEmpty();
}
}
//测试结果
true
//若输入solution.isValid("{[)}") 返回false

数据结构 -- 栈(Stack)的更多相关文章

  1. C# 数据结构 栈 Stack

    栈和队列是非常重要的两种数据结构,栈和队列也是线性结构,线性表.栈和队列这三种数据结构的数据元素和元素的逻辑关系也相同 差别在于:线性表的操作不受限制,栈和队列操作受限制(遵循一定的原则),因此栈和队 ...

  2. java数据结构 栈stack

    栈(Stack) 栈(Stack)实现了一个后进先出(LIFO)的数据结构. 你可以把栈理解为对象的垂直分布的栈,当你添加一个新元素时,就将新元素放在其他元素的顶部. 当你从栈中取元素的时候,就从栈顶 ...

  3. 数据结构—栈(Stack)

    栈的定义--Stack 栈是只允许在末端进行插入和删除的线性表.栈具有后进先出的特性(LIFO ,Last In Fast Out). 学过数据结构的人都知道:栈可以用两种方式来实现,一种方法是用数组 ...

  4. 模板 - 数据结构 - 栈/Stack

    普通的栈大家都会写,STL的栈据说默认实现方式是deque,没关系反正deque跑得飞快. 这里收录的是一些奇怪的栈,当然双栈实现的队列收录在队列里面. 对顶栈 众所周知,栈可以维护一系列前缀和,包括 ...

  5. 数据结构----栈stack

    栈的概念与数据结构 栈(有时称为“后进先出栈”)是一个元素的有序集合,其中添加移除新元素总发生在同一端.这一端通常称为“顶部”.与顶部对应的端称为“底部”.栈的底部很重要,因为在栈中靠近底部的元素是存 ...

  6. [C++][数据结构]栈(stack)的实现

    对于栈的定义,前人之述备矣. 我实现的是一个stack<value>容器类,支持push,pop,top,size,empty,clear和copy construction操作. 主要的 ...

  7. python基本数据结构栈stack和队列queue

    1,栈,后进先出,多用于反转 Python里面实现栈,就是把list包装成一个类,再添加一些方法作为栈的基本操作. 栈的实现: class Stack(object): #初始化栈为空列表 def _ ...

  8. 【Java数据结构学习笔记之二】Java数据结构与算法之栈(Stack)实现

      本篇是java数据结构与算法的第2篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 顺序栈的设计与实现 链式栈的设计与实现 栈的应用 栈的抽象数据类型   栈是 ...

  9. Python与数据结构[1] -> 栈/Stack[0] -> 链表栈与数组栈的 Python 实现

    栈 / Stack 目录 链表栈 数组栈 栈是一种基本的线性数据结构(先入后出FILO),在 C 语言中有链表和数组两种实现方式,下面用 Python 对这两种栈进行实现. 1 链表栈 链表栈是以单链 ...

  10. java数据结构——栈(Stack)

    学习数据结构与算法是枯燥的,但只有坚持不懈的积累,才会有硕果累累的明天. /** * 继续学习Java数据结构 ————栈 * 栈的实现其实还是使用数组,只不过我们不能直接访问数组下标,而是通过一个指 ...

随机推荐

  1. python基础-垃圾回收机制

    垃圾回收 Python中的垃圾回收是以引用计数为主,分代收集为辅.引用计数的缺陷是循环引用的问题. 引用计数 原理:当一个对象的引用被创建或者复制时,对象的引用计数加1:当一个对象的引用被销毁时,对象 ...

  2. vscode设置VUE eslint开发环境

    我的使用vscode开发VUE的常用设置 1.安装插件 ESLint Vetur Beautify Prettier - Code formatter Auto Rename Tag -重命名标签,闭 ...

  3. 使用apktool工具遇到 could not decode arsc file 的解决办法

    I: Using Apktool -Beta9 on xx.apk I: Loading resource table... Exception in thread "main" ...

  4. c++ 生成容器元素生成随机数

    // random_shuffle example #include <iostream> // cout #include <algorithm> // random_shu ...

  5. JavaWeb_(Mybatis框架)MyBatis整合Spring框架

    MyBatis + Spring整合开发 a)使用Spring容器用单例模式管理Mybatis的sqlSessionFactory:b)使用Spring管理连接池.数据源等:c)将Dao/Mapper ...

  6. Flutter移动电商实战 --(34)列表页_小BUG的修复

    当高粱酒的子类没有数据返回的时候就会报错. 解决接口空数据报错的问题 没有数据的时候,给用户一个友好的提示, 我们没有数据的时候还要告诉用户,提示一下他没有数据,在我们的右侧列表的build方法内去判 ...

  7. P2308 添加括号

    P2308 添加括号 题解 一看这题---我能AC 看完这题---我要换题 这题第二问其实就是一个链的石子合并,也就是不用处理环 所以一三问怎么处理??? 数组 mid[ i ][ j ] 记录区间 ...

  8. UML期末复习题——2.4:Domain Model

    第四题:领域模型 重要概念: 1. 领域模型:是对领域内的概念类或现实世界中对象的可视化表示.领域模型也称为概念模型,领域对象模型和分析对象模型. 2. 应用UML表示法,领域模型被描述为一组没有定义 ...

  9. Jetson TX2介绍

    Jetson TX2是NIVDIA瞄准人工智能在Jetson TK1和TX1推出后的升级 TX2的GPU和CPU都进行了升级,内存增加到了8GB.存储增加到了32GB,支持Wifi和蓝牙,编解码支持H ...

  10. IOS项目集成ShareSDK实现第三方登录、分享、关注等功能

    (1)官方下载ShareSDK iOS 2.8.8,地址:http://sharesdk.cn/ (2)根据实际情况,引入相关的库,参考官方文档. (3)在项目的AppDelegate中一般情况下有三 ...