![75eb74934f09c3b82a5dba8d72ed574b.png](https://i-blog.csdnimg.cn/blog_migrate/7e8946c9949cf7aa22248547ed68e53a.jpeg)
栈是一种线性结构(有序集合),添加元素和取出元素都只能是同一端,遵循LIFO(Last In First Out)后进先出原则,所有的操作就是基于一个动态数组(可参考此文章中动态数组的实现)进行二次封装,实现后进先出的功能。
入栈和出栈
![7fb40eb4a1ccb62aea41e9c7ebb2b053.gif](https://i-blog.csdnimg.cn/blog_migrate/acf6e580febbb347763cb97e6bc4e10e.gif)
栈的应用非常广泛,比如文本编辑器的撤销操作就是靠栈这个数据结构维护的
![1728794b94a391afe964d0a388dde132.gif](https://i-blog.csdnimg.cn/blog_migrate/44e206e805b9258c7f25843203a80758.gif)
再举个例子:程序调用过程的系统栈也应用到了栈这个数据结构,当函数中有子函数且执行到子函数时,系统会保存当前函数执行过程到系统栈中,然后执行子函数,看张图理解一下。
A2和B2表示方法名称和方法执行到的行数
![a36228b8141f680b3fa6669b60292cbf.gif](https://i-blog.csdnimg.cn/blog_migrate/5b171461542ce0061491dc8455498a2c.gif)
理解了上面的概念我们看一下代码实现
/*
ArrayStack类复用了 Java实现数据结构之【动态数组】 中实现的动态数组Array类,这么做也是为了能够让前面所学的知识连贯起来
/*
练习:有效的括号
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: "()"
输出: true
示例 2:
输入: "()[]{}"
输出: true
示例 3:
输入: "(]"
输出: false
示例 4:
输入: "([)]"
输出: false
示例 5:
输入: "{[]}"
输出: true
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses
代码解析:
public class Solution {
public static boolean isValid(String s) {
if (s.equals(""))
return true;
ArrayStack<Character> stack = new ArrayStack<>();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c == '{' || c == '[' || c == '(') {
stack.push(c);
} else {
if (stack.isEmpty())
return false;
char top = stack.pop();
if (c == '}' && top != '{')
return false;
if (c == ']' && top != '[')
return false;
if (c == ')' && top != '(')
return false;
}
}
return stack.isEmpty();
}
}