从理念至实践:深入解读与实战编码——探索解码栈的奥秘

目录

一.栈的定义与原理

二.栈的实现(使用数组实现)

 三.栈的实战运用案例

 四.总结


一.栈的定义与原理

栈的定义: 栈是一种特殊的线性表数据结构,它遵循“后进先出”(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;
    }
}

以下是  栈 内含的一些重要方法 与解释功能 

 三.栈的实战运用案例

20. 有效的括号 - 力扣(LeetCode)

入门  让左括号入栈(与右括号匹配) 是一个小技巧

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("/");
    }
}

 四.总结

栈作为一种基础的数据结构,其核心价值体现在以下几点:

  1. 后进先出原则:栈的LIFO特性使得其在处理需要“最近添加最后移除”的逻辑场景中表现出色,例如函数调用栈、表达式求值及回溯算法等。
  2. 操作简洁高效:栈仅提供压栈和弹栈两种基本操作,结构简单且易于实现,有利于提高算法效率和降低系统复杂性。
  3. 广泛应用领域:栈不仅广泛应用于计算机科学各个分支,如编译器设计、操作系统内存管理、图形用户界面事件处理等,还常见于日常生活的抽象思维模型构建。
  4. 结合其他数据结构:栈与其他数据结构结合形成混合型数据结构,以满足更为复杂的应用需求,例如堆栈(StackQueue),结合了栈和队列的特点,既支持后进先出也支持先进先出的操作。
  5. 新兴技术应用:随着人工智能、大数据、云计算等领域的迅速发展,栈这一经典数据结构将在新的应用场景下焕发新的活力,例如在神经网络计算、分布式系统的任务调度等方面可能产生新的应用形态。

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值