当前位置: 首页 > article >正文

【栈和队列(1)(逆波兰表达式)】

文章目录

  • 前言
  • 什么是栈(Stack)
  • 栈方法
  • 栈的模拟实现
  • 链表也可以实现栈
  • 逆波兰表达式
    • 逆波兰表达式在栈中怎么使用


前言

什么是栈(Stack)

栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。遵循先进后出的原则。

类似于:一串羊肉串,后串进去的肉最先被吃到。
底层是数组
在这里插入图片描述

栈方法

在这里插入图片描述

栈的模拟实现

//接口
public interface IStack {
    //放元素
    void push(int x);
    //取元素
    int pop();
    //查看元素
    int peek();
    //栈大小
    int size();
    //判断满没满
    boolean empty();
    //判断空没空
    boolean full();
}

package stackdemo;
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,elem.length*2);
        }
        //没满就放x
        elem[usedSize] = x;
        usedSize++;
    }
    //取出栈顶元素
    @Override
    public int pop() {
        if (empty()){
            //抛异常
            throw new EmptyException("栈空了!");
        }
        int old = elem[usedSize-1];//usedSize往栈底移动一格
        usedSize--;//相当于删除
        //如果是引用类型
        //elem[usedSize] = null;
        return old;
    }

    //查找栈顶的元素,跟pop不一样的是,peek不用删除噢,只是返回栈顶那个元素噢
    @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;
    }
}
//抛异常
public class EmptyException extends RuntimeException {
    //构造方法
    public EmptyException(String msg){
        super(msg);
    }
}

链表也可以实现栈

单链表
在这里插入图片描述
双向链表
从头入 从头出都可以
在这里插入图片描述

  1. 若进栈序列为 1,2,3,4 ,进栈过程中可以出栈,则下列不可能的一个出栈序列是()
    A: 1,4,3,2 B: 2,3,4,1 C: 3,1,4,2 D: 3,4,2,1
    答案:C

  2. 一个栈的初始状态为空。现将元素1、2、3、4、5、A、B、C、D、E依次入栈,然后再依次出栈,则元素出栈的顺
    序是( )。
    A: 12345ABCDE B: EDCBA54321 C: ABCDE12345 D: 54321EDCBA
    答案:B

逆波兰表达式

下面举的例子是后缀表达式,就是把符号移到括号右边。

怎么转换成逆波兰表达式

逆波兰表达式在栈中怎么使用

1.把式子转换成逆波兰表达式后
2.遇到数字就放栈里面
2.当遇到非数字字符,取出栈里面最顶上的两个元素,第一个元素放在字符右边,第二个放左边。
3.得到的结果又放进栈里面
4.再继续上面步骤

逆波兰表达式演示视频

class Solution {
     public int evalRPN(String[] tokens) {
            Stack<Integer> stack = new Stack<>();

            for(String s : tokens) {
                //不是操作符就是数字
                if (!isOperation(s)) {
                    stack.push(Integer.parseInt(s));

                } else {
                    int num2 = stack.pop();
                    int num1 = stack.pop();
                    switch (s) {
                        case "+":
                            stack.push(num1 + num2);
                            break;
                        case "-":
                            stack.push(num1 - num2);
                            break;
                        case "*":
                            stack.push(num1 * num2);
                            break;
                        case "/":
                            stack.push(num1 / num2);
                            break;
                    }
                }
            }
            return stack.pop();
        }
        private boolean isOperation(String s) {
            if (s.equals("+") || s.equals("-") || s.equals("*") || s.equals("/")) {
                return true;
                //是返回true
            }
            //不是返回false
            return false;
        }
}

http://www.kler.cn/news/148680.html

相关文章:

  • Ps:子路径的上下排列以及对齐与分布
  • 【开发实践】使用POI实现导出带有复杂表头的的excel文件
  • 璞华大数据产品入选中国信通院“铸基计划”
  • 【开源】基于Vue+SpringBoot的学校热点新闻推送系统
  • 梦极光(ez_re???)
  • MYSQL基础知识之【LIKE子句的使用 ,NULL值的处理,空值的处理】
  • ArrayList和顺序表
  • 服务器中深度学习环境的配置
  • 使用OSS搭建私有云内网yum仓库的方法
  • 盖茨表示GPT-5不会比GPT-4有太大改进;Intro to Large Language Models
  • 羽隔已就之图像处理之BP神经网络入门
  • C++ day36 贪心算法 无重叠区间 划分字母区间 合并区间
  • 计算机网络高频面试八股文
  • 解决Hadoop DataNode ‘Incompatible clusterIDs‘报错
  • 关于Unity中字典在Inspector的显示
  • 一、Lua基础
  • 【C++ 程序设计入门基础】- 第3节-循环结构01
  • Linux配置路由功能及添加静态路由
  • 免费查找文献期刊数据论文网站
  • 【Qt之QTextDocument】使用及表格显示富文本解决方案
  • 基于STC12C5A60S2系列1T 8051单片机的IIC总线器件24C02记录单片机上电次数应用
  • kubectl rollout 实现金丝雀发布的流量控制策略
  • 经典滑动窗口试题(二)
  • 【LeetCode刷题-链表】--86.分隔链表
  • LLM、ChatGPT与多模态必读论文150篇
  • 使用opencv将sRGB格式的图片转换为Adobe-RGB格式【sRGB】【Adobe-RGB】
  • 数据挖掘 朴素贝叶斯
  • tp6框架 万级数据入库 php函数优化
  • 如何解决 Java 中的 IllegalArgumentException 异常?
  • Windows10系统卸载服务和删除服务