目录
一.栈的定义与原理
栈的定义: 栈是一种特殊的线性表数据结构,它遵循“后进先出”(Last In, First Out, LIFO)的原则。这意味着最后进入栈中的元素将最先离开栈,就像一叠盘子,你最后放在上面的盘子会最先被取走。栈只能在其一端,即栈顶进行插入(Push)和删除(Pop)操作。栈底是固定的,并不执行插入和删除操作。
栈在现实生活中的例子:
二.栈的实现(使用数组实现)
package Stack_Demo;
import java.util.Arrays;
public class MyStack implements IStack{
// 栈 的底层是 数组
private int[] elem;
private int usedSize;
private static final int DEFAULT_CAPACITY=10;//默认容量
public MyStack(){
elem = new int[DEFAULT_CAPACITY];
}
@Override
public void push(int x) {
// 进 栈
if(full()){
elem= Arrays.copyOf(elem,2*elem.length);
}
elem[usedSize++] = x;
//等价于 else[usedSize] = x; usedSize++;
}
@Override
public int pop() {
// 出 栈 出来就栈里面没了
if (empty()){
throw new EmptyException("栈, 空了");
}
int oldValue = elem[--usedSize];
usedSize--;//相当与删除
return oldValue;
}
@Override
public int peek() {
// 获取栈顶元素 不删除
if (empty()){
throw new EmptyException("栈,空了!");
}
return elem[usedSize-1];
}
@Override
public int size() {
return usedSize;
}
@Override
public boolean empty() {
return usedSize == 0 ;
}
@Override
public boolean full() {
if(usedSize==elem.length){
return true;
}
return false;
}
}
以下是 栈 内含的一些重要方法 与解释功能
三.栈的实战运用案例
入门 让左括号入栈(与右括号匹配) 是一个小技巧
import java.util.Stack;
class Solution {
public boolean isValid(String s) {
Stack<Character> stack = new Stack<>();
// 1. 先遍历
for(int i = 0; i < s.length(); i++){ // 修正1
char ch = s.charAt(i);
// 2. 左括号进栈
if(ch == '(' || ch == '{' || ch == '['){
stack.push(ch);
}else{
// 如果栈为空,说明没有相应的左括号与之匹配
if(stack.empty()){ // 修正2
return false;
}
char topChar = stack.pop(); // 修正3
// 检查栈顶元素是否与当前右括号匹配
if((ch == ')' && topChar != '(') || // 修正4
(ch == '}' && topChar != '{') ||
(ch == ']' && topChar != '[')){
return false;
}
}
}
// 如果栈为空,说明所有的括号都被匹配了
return stack.empty();
}
}
155. 最小栈 - 力扣(LeetCode) 需要做 辅助栈 帮助寻找最小值
150. 逆波兰表达式求值 - 力扣(LeetCode) 需要先学一下 后缀表达式 然后解题就不难了 与上述题目类似
代码实现
class Solution {
public int evalRPN(String[] tokens) {
Stack<Integer> stack = new Stack<>();
for(String x:tokens){
if(!isOperation(x)){
// 不是运算符,是数字
stack.push(Integer.parseInt(x));
}else{
int n2 = stack.pop();//先出来的是右操作数,栈的特点,先进后出
int n1 = stack.pop();
switch(x)
{
case "+":
stack.push(n1+n2);
break;
case "-":
stack.push(n1-n2);
break;
case "*":
stack.push(n1 * n2);
break;
case"/":
stack.push(n1 / n2);
break;
}
}
}
return stack.pop();
}
// 判断是否为运算符
private boolean isOperation(String s) {
return s.equals("+") || s.equals("-") || s.equals("*") || s.equals("/");
}
}
四.总结
栈作为一种基础的数据结构,其核心价值体现在以下几点:
- 后进先出原则:栈的LIFO特性使得其在处理需要“最近添加最后移除”的逻辑场景中表现出色,例如函数调用栈、表达式求值及回溯算法等。
- 操作简洁高效:栈仅提供压栈和弹栈两种基本操作,结构简单且易于实现,有利于提高算法效率和降低系统复杂性。
- 广泛应用领域:栈不仅广泛应用于计算机科学各个分支,如编译器设计、操作系统内存管理、图形用户界面事件处理等,还常见于日常生活的抽象思维模型构建。
- 结合其他数据结构:栈与其他数据结构结合形成混合型数据结构,以满足更为复杂的应用需求,例如堆栈(StackQueue),结合了栈和队列的特点,既支持后进先出也支持先进先出的操作。
- 新兴技术应用:随着人工智能、大数据、云计算等领域的迅速发展,栈这一经典数据结构将在新的应用场景下焕发新的活力,例如在神经网络计算、分布式系统的任务调度等方面可能产生新的应用形态。