数据结构 -- 栈(Stack)
一、栈的简介

定义
栈(英语: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)的更多相关文章
- C# 数据结构 栈 Stack
栈和队列是非常重要的两种数据结构,栈和队列也是线性结构,线性表.栈和队列这三种数据结构的数据元素和元素的逻辑关系也相同 差别在于:线性表的操作不受限制,栈和队列操作受限制(遵循一定的原则),因此栈和队 ...
- java数据结构 栈stack
栈(Stack) 栈(Stack)实现了一个后进先出(LIFO)的数据结构. 你可以把栈理解为对象的垂直分布的栈,当你添加一个新元素时,就将新元素放在其他元素的顶部. 当你从栈中取元素的时候,就从栈顶 ...
- 数据结构—栈(Stack)
栈的定义--Stack 栈是只允许在末端进行插入和删除的线性表.栈具有后进先出的特性(LIFO ,Last In Fast Out). 学过数据结构的人都知道:栈可以用两种方式来实现,一种方法是用数组 ...
- 模板 - 数据结构 - 栈/Stack
普通的栈大家都会写,STL的栈据说默认实现方式是deque,没关系反正deque跑得飞快. 这里收录的是一些奇怪的栈,当然双栈实现的队列收录在队列里面. 对顶栈 众所周知,栈可以维护一系列前缀和,包括 ...
- 数据结构----栈stack
栈的概念与数据结构 栈(有时称为“后进先出栈”)是一个元素的有序集合,其中添加移除新元素总发生在同一端.这一端通常称为“顶部”.与顶部对应的端称为“底部”.栈的底部很重要,因为在栈中靠近底部的元素是存 ...
- [C++][数据结构]栈(stack)的实现
对于栈的定义,前人之述备矣. 我实现的是一个stack<value>容器类,支持push,pop,top,size,empty,clear和copy construction操作. 主要的 ...
- python基本数据结构栈stack和队列queue
1,栈,后进先出,多用于反转 Python里面实现栈,就是把list包装成一个类,再添加一些方法作为栈的基本操作. 栈的实现: class Stack(object): #初始化栈为空列表 def _ ...
- 【Java数据结构学习笔记之二】Java数据结构与算法之栈(Stack)实现
本篇是java数据结构与算法的第2篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 顺序栈的设计与实现 链式栈的设计与实现 栈的应用 栈的抽象数据类型 栈是 ...
- Python与数据结构[1] -> 栈/Stack[0] -> 链表栈与数组栈的 Python 实现
栈 / Stack 目录 链表栈 数组栈 栈是一种基本的线性数据结构(先入后出FILO),在 C 语言中有链表和数组两种实现方式,下面用 Python 对这两种栈进行实现. 1 链表栈 链表栈是以单链 ...
- java数据结构——栈(Stack)
学习数据结构与算法是枯燥的,但只有坚持不懈的积累,才会有硕果累累的明天. /** * 继续学习Java数据结构 ————栈 * 栈的实现其实还是使用数组,只不过我们不能直接访问数组下标,而是通过一个指 ...
随机推荐
- python基础-垃圾回收机制
垃圾回收 Python中的垃圾回收是以引用计数为主,分代收集为辅.引用计数的缺陷是循环引用的问题. 引用计数 原理:当一个对象的引用被创建或者复制时,对象的引用计数加1:当一个对象的引用被销毁时,对象 ...
- vscode设置VUE eslint开发环境
我的使用vscode开发VUE的常用设置 1.安装插件 ESLint Vetur Beautify Prettier - Code formatter Auto Rename Tag -重命名标签,闭 ...
- 使用apktool工具遇到 could not decode arsc file 的解决办法
I: Using Apktool -Beta9 on xx.apk I: Loading resource table... Exception in thread "main" ...
- c++ 生成容器元素生成随机数
// random_shuffle example #include <iostream> // cout #include <algorithm> // random_shu ...
- JavaWeb_(Mybatis框架)MyBatis整合Spring框架
MyBatis + Spring整合开发 a)使用Spring容器用单例模式管理Mybatis的sqlSessionFactory:b)使用Spring管理连接池.数据源等:c)将Dao/Mapper ...
- Flutter移动电商实战 --(34)列表页_小BUG的修复
当高粱酒的子类没有数据返回的时候就会报错. 解决接口空数据报错的问题 没有数据的时候,给用户一个友好的提示, 我们没有数据的时候还要告诉用户,提示一下他没有数据,在我们的右侧列表的build方法内去判 ...
- P2308 添加括号
P2308 添加括号 题解 一看这题---我能AC 看完这题---我要换题 这题第二问其实就是一个链的石子合并,也就是不用处理环 所以一三问怎么处理??? 数组 mid[ i ][ j ] 记录区间 ...
- UML期末复习题——2.4:Domain Model
第四题:领域模型 重要概念: 1. 领域模型:是对领域内的概念类或现实世界中对象的可视化表示.领域模型也称为概念模型,领域对象模型和分析对象模型. 2. 应用UML表示法,领域模型被描述为一组没有定义 ...
- Jetson TX2介绍
Jetson TX2是NIVDIA瞄准人工智能在Jetson TK1和TX1推出后的升级 TX2的GPU和CPU都进行了升级,内存增加到了8GB.存储增加到了32GB,支持Wifi和蓝牙,编解码支持H ...
- IOS项目集成ShareSDK实现第三方登录、分享、关注等功能
(1)官方下载ShareSDK iOS 2.8.8,地址:http://sharesdk.cn/ (2)根据实际情况,引入相关的库,参考官方文档. (3)在项目的AppDelegate中一般情况下有三 ...