2022: 暴杀表达式, 脚踩逆波兰的时候到了

【CSP-J 2022】逻辑表达式 【CSP-J 2022】逻辑表达式 解题报告 阅读详情

前言

★ 这里是小冷的博客
✓ 优质技术好文见专栏
个人公众号,分享一些技术上的文章,以及遇到的坑
当前系列:数据结构系列
源代码 git 仓库 ‘
数据结构代码地址 代码Git 仓库地址

认识表达式与 逆波兰计算器实现

什么是前缀,什么中缀,什么是后缀?(理论加举例)

前缀

前缀表达式是一种没有括号的算术表达式,与中缀表达式不同的是,其将运算符写在前面,操作数写在后面。为纪念其发明者波兰数学家Jan Lukasiewicz,前缀表达式也称为“波兰式”。例如,- 1 + 2 3,它等价于1-(2+3)。

我们完成一个逆波兰计算器,要求完成如下任务:

  1. 输入一个逆波兰表达式(后缀表达式),使用栈(Stack), 计算其结果

  2. 支持小括号和多位数整数,因为这里我们主要讲的是数据结构,因此计算器进行简化,只支持对整数的计算。

中缀

(或中缀记法)是一个通用的算术或逻辑公式表示方法, 操作符是以中缀形式处于操作数的中间(例:3 + 4),中缀表达式是人们常用的算术表示方法。

与前缀表达式(例:+ 3 4)或后缀表达式(例:3 4 +)相比,中缀表达式不容易被计算机解析,但仍被许多程序语言使用,因为它符合人们的普遍用法。

与前缀或后缀记法不同的是,中缀记法中括号是必需的。计算过程中必须用括号将操作符和对应的操作数括起来,用于指示运算的次序。

例:

(1)8+4-6*2用后缀表达式表示为:

​ 8 4+6 2*-

(2)2*(3+5)+7/1-4用后缀表达式表示为**:**

​ 235+*71/+4-

后缀

这种表示方式把运算符写在运算对象的后面,例如,把a+b写成ab+,所以也称为后缀式。这种表示法的优点是根据运算对象和算符的出现次序进行计算,不需要使用括号,也便于用械实现求值。对于表达式x:=(a+b)(c+d),其后缀式为xab+cd+:=。

原表达式:a*(b*(c+d/e)-f)# /* # 为表达式结束符号*/

后缀式:abcde/+f-#

为运算符定义优先级:# ( + - * / **

-1 0 1 1 2 2 3

从原表达式求后缀式的规则为:

思路分析

例如: (3+4)×5-6 对应的后缀表达式就是 3 4 + 5 × 6 - , 针对后缀表达式求值步骤如下:

1.从左至右扫描,将 3 和 4 压入堆栈;

2.遇到+运算符,因此弹出 4 和 3(4 为栈顶元素,3 为次顶元素),计算出 3+4 的值,得 7,再将 7 入栈;

3.将 5 入栈;

4.接下来是×运算符,因此弹出 5 和 7,计算出 7×5=35,将 35 入栈;

5.将 6 入栈;

6.最后是-运算符,计算出 35-6 的值,即 29,由此得出最终结果

代码实现

    public static void main(String[] args) {
        //定义逆波兰表达式
        //    测试
        String suffixExpression = "3 4 + 5 * 6 -";
        //    思路
        //    1. 先将 3 4 + 5 * 6 - 方法哦 ArrayList中
        //    2. 将 Arraylist 传递一个方法 遍历ArrayList 配合栈完成计算
        List<String> list = getListString(suffixExpression);
        System.out.println("rpnlist = " + list);
        int res = calculate(list);
        System.out.println("计算的结果是 = " + res);
    }

    /**
     * @author 冷环渊 Doomwatcher
     * @context: 将一个逆波兰表达式的数据和运算符 依次放入Arraylist中
     * @date: 2021/12/25 18:09
     * @param suffixExpression
     * @return: java.util.List<java.lang.String> 将分割好的字符List 返回
     */
    public static List<String> getListString(String suffixExpression) {
        //  分割字符串 将后缀表达式的每一个字符取出
        String[] split = suffixExpression.split(" ");
        // 我们用list 来存储分割出来的表达式,这样之后我们就需要遍历即可
        List<String> list = new ArrayList<>();

        for (String ele : split) {
            list.add(ele);
        }
        return list;
    }
/**
     * @author 冷环渊 Doomwatcher
     * @context: 这个方法就是 逆波兰表达式的运算处理方法
     *  * 实现思路 : 我们以 (3+4)*4-6 对应的后缀表达式 => 3 4 + 5 * 6 -
     *  * 1) 从左至右扫描,将3和4压入栈
     *  * 2) 遇到+运算符号 因此弹出 4 和 3 (4为栈顶元素 3 为次顶元素) 计算出3+4的值,将计算的结果加入栈
     *  * 3) 将5 入栈
     *  * 4) 接下来将 * 是运算符 弹出 5和7 计算出 7*5  = 35 将结果入栈
     *  * 5) 将6 入栈
     * @date: 2021/12/25 18:14
     * @param ls
     * @return: int 返回的是一个运算结果
     */
    public static int calculate(List<String> ls) {
        //创建栈 只需要一个栈即可
        Stack<String> stack = new Stack<>();
        //    遍历处理
        for (String item : ls) {
            // 这里我们用正则表达式来取出数字 和符号 如果是数字进行处理,如果符号做另外的处理
            if (item.matches("\\d+")) {
                //匹配的是数字
                stack.push(item);
            } else {
                //    如果是符号就 pop出两个数 运算之后结果入栈
                int num2 = Integer.parseInt(stack.pop());
                int num1 = Integer.parseInt(stack.pop());
                int res = 0;
                if ("+".equals(item)) {
                    res = num1 + num2;
                } else if ("-".equals(item)) {
                    res = num1 - num2;
                } else if ("*".equals(item)) {
                    res = num1 * num2;
                } else if ("/".equals(item)) {
                    res = num1 / num2;
                } else {
                    throw new RuntimeException("运算符有误");
                }
                //    把 res 入栈
                stack.push("" + res);
            }
        }
        //最后留在stack 中的数据是运算结果
        return Integer.parseInt(stack.pop());
    }

这里我们用list加栈的方式实现了表达式的运算

需要注意的几点:

  • 从中体会 后缀表达式和中缀表达式的转换
  • 计算上,后缀与中缀的区别

中缀转后缀表达式

大家看到,后缀表达式适合计算式进行运算,但是人却不太容易写出来,尤其是表达式很长的情况下,因此在开发 中,我们需要将 中缀表达式转成后缀表达式。 所以我们需要用代码将中缀表达式处理成后缀表达式之后运算一劳永逸

思路

1.初始化两个栈 元素安抚栈 s1 和存储中间结果的栈2
2.从左至右扫描中缀表达式
3.遇到操作数时 将其压入s2
4.遇到运算符时 比较其与s1栈顶的运算符优先级别:
1。如果s1为空 或者栈顶运算符为左括号( 则直接将此运算符压入栈
2.否则,若优先级别比栈顶运算符的高,也将运算符压入s1
3.否则 将s1栈顶的于是暖夫弹出并且压入s2栈内 再次转到 4.1与s1新的扎你当运算符比较
5.遇到括号时:
1.如果是左括号( ,则直接压入s1
2.如果是右括号),则一次弹出s1栈顶的运算符,并且压入s2,直到遇到左括号位置,此时将一对括号丢弃
6.重复步骤 2-5 直到表达式最右边
7.将s1中剩余的运算符一次弹出并压入s2
8.依次弹出s2中的元素并且输出,结果逆序就是中缀表达式对应的后缀的表达式

思路举例

将中缀表达式“1+((2+3)×4)-5”转换为后缀表达式的过程如下

因此结果为 :“1 2 3 + 4 × + 5 –”

image-20220102174131773

编码

跟着思路来实现代码

image-20220102174207424

代码实现

package com.hyc.DataStructure.Stack;

import java.util.ArrayList;
import java.util.List;
import java.util.Stack;

/**
 * @projectName: DataStructure
 * @package: com.hyc.DataStructure.Stack
 * @className: PolandExpression
 * @author: 冷环渊 doomwatcher
 * @description: TODO
 * 实现思路 : 我们以 (3+4)*4-6 对应的后缀表达式 => 3 4 + 5 * 6 -
 * 1) 从左至右扫描,将3和4压入栈
 * 2) 遇到+运算符号 因此弹出 4 和 3 (4为栈顶元素 3 为次顶元素) 计算出3+4的值,将计算的结果加入栈
 * 3) 将5 入栈
 * 4) 接下来将 * 是运算符 弹出 5和7 计算出 7*5  = 35 将结果入栈
 * 5) 将6 入栈
 * 最后 是 - 运算符 计算出 35-6  = 29 由此得出最后的结果
 *
 * 使用技术 这里我们用 java给我们提供的 Stack 和 ArrayList组合来实现计算器
 * @date: 2021/12/25 18:00
 * @version: 1.0
 */
public class PolandExpression {
    public static void main(String[] args) {

        //定义中缀表达式 ,转成后置表达式之后运算
        String expression = "1+((2+3)*4)-5";
        //拆成链表
        List<String> infixExpressionList = toinfixExpression(expression);
        System.out.println("中缀表达式对应的list=" + infixExpressionList);
        List<String> suffixexpression = parseSuffixExpressionList(infixExpressionList);
        System.out.println("后缀表达式对应的List" + suffixexpression);
        System.out.printf("expression=%d", calculate(suffixexpression));

        //定义逆波兰表达式
        //    测试
        String suffixExpression = "3 4 + 5 * 6 -";
        //    思路
        //    1. 先将 3 4 + 5 * 6 - 方法哦 ArrayList中
        //    2. 将 Arraylist 传递一个方法 遍历ArrayList 配合栈完成计算
        List<String> list = getListString(suffixExpression);
        System.out.println("rpnlist = " + list);
        int res = calculate(list);
        System.out.println("计算的结果是 = " + res);
    }

    /**
     * @author 冷环渊 Doomwatcher
     * @context: 将 Arraylist[1,+,(,(,2,+,3,),*,4,),-,5]  转化成  Arraylist[1,2,3,+,4,*,5,-]
     *  转换思路:
     * 1. 初始化两个栈 元素安抚栈 s1 和存储中间结果的栈2
     * 2.从左至右扫描中缀表达式
     * 3.遇到操作数时 将其压入s2
     * 4.遇到运算符时 比较其与s1栈顶的运算符优先级别:
     *  1。如果s1为空 或者栈顶运算符为左括号( 则直接将此运算符压入栈
     *  2.否则,若优先级别比栈顶运算符的高,也将运算符压入s1
     *  3.否则 将s1栈顶的于是暖夫弹出并且压入s2栈内 再次转到 4.1与s1新的扎你当运算符比较
     * 5.遇到括号时:
     *  1.如果是左括号( ,则直接压入s1
     *  2.如果是右括号),则一次弹出s1栈顶的运算符,并且压入s2,直到遇到左括号位置,此时将一对括号丢弃
     * 6.重复步骤 2-5 直到表达式最右边
     * 7.将s1中剩余的运算符一次弹出并压入s2
     * 8.依次弹出s2中的元素并且输出,结果逆序就是中缀表达式对应的后缀的表达式
     *
     * @date: 2021/12/27 17:48
     * @param
     * @return: java.util.List<java.lang.String>
     */
    public static List<String> parseSuffixExpressionList(List<String> ls) {
        //    定义两个栈
        /*符号栈*/
        Stack<String> s1 = new Stack<>();
        /* S2 思路说明
         * 这里我们使用栈 在转换过程中我们不需要pop操作,而且这个s2 之后我们需要逆序输出操作很麻烦
         * 于是这里使用List来当作 s2 的数据存储结构
         * */
        List<String> s2 = new ArrayList<>();
        //    遍历 ls
        for (String item : ls) {
            //  如果是一个数字 那么就加入 S2(这里我们字符串加入 正则表达式来判断是不是一个数字)
            if (item.matches("\\d+")) {
                s2.add(item);
            } else if (item.equals("(")) {
                s1.push(item);
            } else if (item.equals(")")) {
                //    如果是 )右括号 则一次弹出 s1栈顶的运算符 并且压入 s2 知道遇到左括号为止,完成前置的一系列操作之后将这一对括号丢弃
                while (!s1.peek().equals("(")) {
                    s2.add(s1.pop());
                }
                // 弹出( 消除掉一组括号
                s1.pop();
            } else {
                /* 当 item 优先级小于等于s1 栈顶运算符的时候 将s1栈顶的运算符淡出并且加入到s2 中,再次重复思路中的第四个环节,与s1中的新栈顶运算符比较
                 *问题 我们缺少一个比较优先级高低的方法
                 * */
                while (s1.size() != 0 && Operation.getValue(s1.peek()) >= Operation.getValue(item)) {
                    s2.add(s1.pop());
                }
                //    之后将 itea 压入栈
                s1.push(item);
            }

        }
        //    将s1中剩余的运算符一次弹出加入s2
        while (s1.size() != 0) {
            s2.add(s1.pop());
        }
        //    注意应为存放的是list 这里我们顺序不需要改变 直接输出就是对应的后缀表达式
        return s2;
    }

    /**
     * @author 冷环渊 Doomwatcher
     * @context: 将中缀表达式 转换成对应的list
     * @date: 2021/12/27 17:32
     * @param s
     * @return: java.util.List<java.lang.String>
     */
    public static List<String> toinfixExpression(String s) {
        /*定义一个List 存放中缀表达式的对应内容*/
        List<String> ls = new ArrayList<>();
        //定义一个指针 用于遍历 中缀表达式的字符串
        int i = 0;
        // 用于拼接字符串
        String str;
        //用于存放遍历的字符
        char c;
        do {
            //   如果c是一个非数字 那么我们需要加入到 ls 中去 ,这里的判断条件是 ASCLL值
            if ((c = s.charAt(i)) < 48 || ((c = s.charAt(i)) > 57)) {
                ls.add("" + c);
                //    指针后移
                i++;
            } else {
                /*
                 * 如果是一个数字 那么我们还需要考虑是不是多位数
                 * 这里我们将 str 置空
                 * */
                str = "";
                while (i < s.length() && (c = s.charAt(i)) >= 48 && ((c = s.charAt(i)) <= 57)) {
                    //拼接数字字符串
                    str += c;
                    i++;
                }
                ls.add(str);
            }
        } while (i < s.length());

        return ls;

    }

    /**
     * @author 冷环渊 Doomwatcher
     * @context: 将一个逆波兰表达式的数据和运算符 依次放入Arraylist中
     * @date: 2021/12/25 18:09
     * @param suffixExpression
     * @return: java.util.List<java.lang.String> 将分割好的字符List 返回
     */
    public static List<String> getListString(String suffixExpression) {
        //  分割字符串 将后缀表达式的每一个字符取出
        String[] split = suffixExpression.split(" ");
        // 我们用list 来存储分割出来的表达式,这样之后我们就需要遍历即可
        List<String> list = new ArrayList<>();

        for (String ele : split) {
            list.add(ele);
        }
        return list;
    }

    /**
     * @author 冷环渊 Doomwatcher
     * @context: 这个方法就是 逆波兰表达式的运算处理方法
     *  * 实现思路 : 我们以 (3+4)*4-6 对应的后缀表达式 => 3 4 + 5 * 6 -
     *  * 1) 从左至右扫描,将3和4压入栈
     *  * 2) 遇到+运算符号 因此弹出 4 和 3 (4为栈顶元素 3 为次顶元素) 计算出3+4的值,将计算的结果加入栈
     *  * 3) 将5 入栈
     *  * 4) 接下来将 * 是运算符 弹出 5和7 计算出 7*5  = 35 将结果入栈
     *  * 5) 将6 入栈
     * @date: 2021/12/25 18:14
     * @param ls
     * @return: int 返回的是一个运算结果
     */
    public static int calculate(List<String> ls) {
        //创建栈 只需要一个栈即可
        Stack<String> stack = new Stack<>();
        //    遍历处理
        for (String item : ls) {
            // 这里我们用正则表达式来取出数字 和符号 如果是数字进行处理,如果符号做另外的处理
            if (item.matches("\\d+")) {
                //匹配的是数字
                stack.push(item);
            } else {
                //    如果是符号就 pop出两个数 运算之后结果入栈
                int num2 = Integer.parseInt(stack.pop());
                int num1 = Integer.parseInt(stack.pop());
                int res = 0;
                if ("+".equals(item)) {
                    res = num1 + num2;
                } else if ("-".equals(item)) {
                    res = num1 - num2;
                } else if ("*".equals(item)) {
                    res = num1 * num2;
                } else if ("/".equals(item)) {
                    res = num1 / num2;
                } else {
                    throw new RuntimeException("运算符有误");
                }
                //    把 res 入栈
                stack.push("" + res);
            }
        }
        //最后留在stack 中的数据是运算结果
        return Integer.parseInt(stack.pop());
    }
}

class Operation {
    private static int ADD = 1;
    private static int SUB = 1;
    private static int MUL = 2;
    private static int DIV = 2;

    //   写一个方法 返回对应的数字
    public static int getValue(String operation) {
        int result = 0;
        switch (operation) {
            case "+":
                result = ADD;
                break;
            case "-":
                result = SUB;
                break;
            case "*":
                result = MUL;
                break;
            case "/":
                result = DIV;
                break;
            default:
                System.out.println("不存在该运算符");
                break;

        }
        return result;
    }
}

总结

  • 计算的思路和我们先前写的逆波兰计算器事一样的
  • 这里我们考虑中缀转后缀的几个要点,运算符优先级和运算符的位置
  • 动手之后,debug看看栈和List的变化加深理解
基于STM32F334C8T6的四开关Buck-Boost双向DC-DC电源设计与实现(附源码、仿真与计算书) 本文详细介绍了基于STM32F334C8T6的四开关Buck-Boost双向DC-DC电源设计方案。该设计利用STM32的高分辨率定时器(HRTIM)实现精确PWM控制,支持Buck、Boost和Buck-Boost三种工作模式自动切换,具备双向能量流动能力。通过PSIM仿真和Mathcad计算书进行参数优化,实测效率达95.8%,适用于新能源系统和电池管理等场景。 阅读详情

相关推荐

NA400与昆仑通态MODBUS/TCP通讯调试说明

点击增加设备通道,弹出窗口进行设置,通道类型选择“0区输出继电器”,通道地址为1,通道个数为1,读写方式为读写。点击增加设备通道,弹出窗口进行设置,通道类型选择“4区输出寄存器”,数据类型选择“16位 无符号二进制”,通道地址为21001,通道个数为1,读写方式为读写。5.添加设备通道:双击莫迪康MODBUSTCP子设备,点击添加设备通道,根据Modbus规约地址表进行参数的设置,表格可在NAPro软件帮助中查看,如下图所示。然后可以在设备通道调试数据中观察到Q1的值为1,NW1的值678,表示通讯成功。

weixin_44281509的博客 2490

java-数据结构-基数排序(桶排序)

java-数据结构-基数排序 基数排序(桶排序)介绍: 1.基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort, 顾名思义,它是通过键值的各个位的值,将要排序的元素分配至某些“桶”中,达到排序的作用 2.基数排序法是属于稳定性的排序,基数排序法的是效率高的稳定性排序法 3.基数排序(Radix Sor...

mirana的专栏 841

【QMIX】一种基于Value-Based多智能体算法

文章目录1. QMIX 解决了什么问题(Motivation)2. QMIX 怎样解决团队收益最大化问题(Method)2.1 算法大框架 —— 基于 AC 框架的 CTDE(Centralized Training Distributed Execution) 模式 QMIX 是一种基于 Value-Based 的多智能体强化学习算法(MARL),其基本思想来源于 Actor-Critic 与 DQN 的结合。使用中心式学习(Centralized Learning)分布式执行(Distributed

qq_38638132的博客 9860

十大经典排序算法:快速排序debug分析排序过程

前言 ★ 这里是小冷的博客 ✓ 优质技术好文见专栏 个人公众号,分享一些技术上的文章,以及遇到的坑 当前系列:数据结构系列 源代码 git 仓库 ‘ 数据结构代码地址 代码Git 仓库地址 目录前言快速排序思路分析快速排序案例排序过程断点调试快速排序测速 快速排序 快速排序法介绍: 快速排序(Quicksort)是对冒泡排序的一种改进。基本思想是:通过一趟排序将要排序的数据分割成独立的两 部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排 序,整个排

doomwatcher的博客 799

深入浅出卡尔曼滤波器算法

深入浅出讲解卡尔曼滤波器的工作原理及其公式推导,讨论卡尔曼滤波器的核心公式所代表的意义及个人的理解。

m0_37835056的博客 1365

基于立创EDA的IP5389BZ+IP6829 100W有线15W无线带屏充电宝DIY全流程解析

本文详细解析了基于立创EDA平台,采用IP5389BZ和IP6829芯片DIY一款100W有线快充、15W无线充电并带显示屏的移动电源的全过程。内容涵盖核心功能规划、硬件选型、电路设计、PCB布局、焊接组装、分步调试以及软件逻辑,为电子爱好者提供了一份从原理到实践的完整指南,并重点强调了电池安全与IP6829供电电压等关键注意事项。

weixin_34374684的博客 307

数据结构-栈应用之逆波兰表达式(后缀表达式)

逆波兰表达式含义我就不做赘述了,摘自百科上的一段话: 逆波兰表达式又叫做后缀表达式。在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,这种表示法也称为中缀表示。波兰逻辑学家J.Lukasiewicz于1929年提出了另一种表示表达式的方法,按此方法,每一运算符都置于其运算对象之后,故称为后缀表示。 逆波兰表达式,它的语法规定,表达式必须以逆波兰表达式的方式给出。逆波兰表达式又叫做后...

727

ESP32驱动MLX90640红外热成像传感器:从报错到成功运行的完整避坑指南

本文是一份详细的ESP32驱动MLX90640红外热成像传感器的实战指南。针对开发中常见的I2C通信失败、数据全零及‘坏点过多’等报错,文章提供了从环境搭建、驱动库选择与改造到实战代码解析的完整解决方案,并分享了数据滤波、热图生成及多任务优化等高级技巧,帮助开发者高效避坑,实现稳定运行。

weixin_29191669的博客 95

『牛客|每日一题』逆波兰表达式

给定一个逆波兰表达式,求表达式的值。 计算逆波兰表达式:遇到数字就压栈,遇到运算符就弹出栈顶两个数进行计算,然后把计算结果压入栈中,直到栈中只剩下最后一个数,就是整个逆波兰表达式的计算结果。 step 1:引入辅助栈stk,遍历字符串,每次遇到数字就入栈,所以栈可以定义为Integer类型 step 2:当遇到"+","-","*","/"字符串的时候,则弹出栈顶两个数,进行相应的运算(先弹出来的是被操作数,后弹出来的是操作数;如减法时,是先弹出来的是被减数,后弹出来的是减数) step 3:将计算结果(

一个专注于客户端开发的技术er,不定期更新Android,Flutter,HormonyOS等方向的使用心得和感悟 672

体素坐标(voxel_coors)在mmdetection3d中的理解

体素坐标(voxel_coors)在mmdetection3d中的理解

weixin_38362784的博客 4218

uniapp [安卓苹果App端] - 实现支付宝支付功能+拉起支付宝app付款支付后返回跳转到原页面,详解uniApp如何唤起本机支付宝并跳转到支付页面全流程及示例源码(APP端支付宝支付,支持打包

全网最详细的uniapp支付宝支付教程,uniapp支付宝支付流程,uni-app项目在APP端使用支付宝支付功能,uniapp前端实现支付宝支付,uniapp中唤醒支付宝进行支付并返回app,uniApp调起支付宝支付失败报错,uniapp app端调支付宝支付接口,uniapp开发安卓App对接支付宝支付,uniapp苹果ios唤起支付宝支付,uniapp调用支付宝支付uniapp开发app-调用支付宝支付,uniapp开发安卓苹果app如何接入支付宝支付,UniApp中实现支付宝支付功能,支付报错,调

🏆 前端领域优质创作者 1万+

【每日一题】逆波兰表达式求值

🌟个人博客:www.hellocode.top🌟 ⭐所有文章均在上方博客首发,其他平台同步更新 🔥本文专栏:《每日一题》 ⚡如有问题,欢迎指正,一起学习~~ 文章部分参考《代码随想录》,如有侵权,请联系删除~~ 时间:2022-05-26 题目序号:150 难度:中等 问题描述 根据 逆波兰表示法,求表达式的值。 有效的算符包括 +、-、*、/ 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。 注意 两个整数之间的除法只保留整数部分。 可以保证给定的逆波兰表达式总是有效的。换句话说,表达式总.

HelloCode 385

36、T5L 迪文屏C51开发之绘制动态曲线

T5L 迪文屏C51开发之绘制动态曲线1、介绍2、例程功能简介3、GUI界面设计3、C51程序设计 1、介绍   本文将利用DGUS Tool软件中的【动态曲线控件】来绘制曲线效果,在T5L迪文屏中总共支持8个通道的曲线,而曲线数据是需要缓冲区的,如果 8 通道曲线同时使用,0x1000-0x4FFF 将作为曲线缓冲区地址,此时该部分变量地址不能被其他控键使用,其他控键地址使用范围为0x5000-0xFFFF,当某曲线通道不被使用时,那么其所对应的缓冲区地址可以做其他用途,曲线通道具体的地址分布如下图所示:

嵌入式羊圈 3133

前缀、中缀、后缀表达式及逆波兰计算器实现

文章目录1.前缀表达式(波兰表达式)1.1 介绍1.2 前缀表达式的计算机求值2.中缀表达式3.后缀表达式(逆波兰表达式)3.1 介绍3.2 后缀表达式的计算机求值4.逆波兰计算器5.中缀表达式转换为后缀表达式5.1 思路分析5.2 代码实现6.完整版逆波兰计算器 1.前缀表达式(波兰表达式) 1.1 介绍 前缀表达式又称波兰式,前缀表达式的运算符位于操作数之前。 举例说明:(3+4)*5-6 对应的前缀表达式就是 - * + 3 4 5 6 1.2 前缀表达式的计算机求值 从右至左扫描表达式,遇到数字

张大安的博客 1391

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

【数据结构】逆波兰表达式

逆波兰表达式的实现,将人认识的中缀表达式转换为计算机认识的后缀表达式(逆波兰表达式),并通过计算机进行表达式的计算求值。

程序员好冰的博客 284

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

2022.2.3 LeetCode——后缀表达式

后缀表达式 + switch-case

LGoGoGo的博客 2022

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

150. 逆波兰表达式求值

150. 逆波兰表达式求值 据 逆波兰表示法,求表达式的值。 有效的算符包括 +、-、*、/ 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。 注意 两个整数之间的除法只保留整数部分。 可以保证给定的逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。 示例 1: 输入:tokens = [“2”,“1”,"+",“3”,"*"] 输出:9 解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9 示例 2: 输入:tokens = [“4”,“13

小菜鸡 186

剑指offer系列——剑指 Offer II 036. 后缀表达式(逆波兰表达式)

大家好!本篇文章将介绍的剑指offerOJ题,来自力扣[剑指 Offer II 036. 后缀表达式],本文将以这道题为背景,介绍后缀表达式,展示代码语言暂时为:Java,如果你对栈还不是很熟悉,建议阅读:栈与Stack类。

未见花闻的博客 565

2022-11-05:给定一个逆波兰式,转化成正确的中序表达式。要求只有必要加括号的地方才加括号。

给出表达式,难点在于去掉没必要的小括号。准备两个栈,一个栈存数字,另一个栈存类型,类型有数字类型,加减类型,乘除类型。最有可能加括号的一定是后来的乘除类型遇到先来的加减类型。2022-11-05:给定一个逆波兰式,转化成正确的中序表达式。要求只有必要加括号的地方才加括号。代码用rust编写。

福大大架构师每日一题 2万+

力扣(LeetCode)150. 逆波兰表达式求值(2022.05.30)

根据 逆波兰表示法,求表达式的值。有效的算符包括 +、-、*、/ 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。注意 两个整数之间的除法只保留整数部分。可以保证给定的逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。示例 1:输入:tokens = [“2”,“1”,“+”,“3”,“*”] 输出:9 解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9 示例 2:输入:tokens = [“4”,“13”,“5”,“/”,“+”] 输出:6

ChaoYue_miku的博客 457

2022.04.19 逆波兰表达式求值

题目地址(150. 逆波兰表达式求值) https://leetcode-cn.com/problems/evaluate-reverse-polish-notation/ 题目描述 根据 逆波兰表示法,求表达式的值。 有效的算符包括 +、-、*、/ 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。 注意 两个整数之间的除法只保留整数部分。 可以保证给定的逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。   示例&n

weixin_47267285的博客 118

四则整数运算(逆波兰java实现)

文章目录 提示:以下是本篇文章正文内容,下面案例可供参考 我是人狠话不多,谦卑尚学呆萌呆萌的小萌新. 主程序模块 package operation; import java.util.Scanner; import java.util.Stack; /** * @author WangJiaHui * @description: about operation * @ClassName Test * @date 2022/1/19 18:39 */ public class Test

欢迎来到烟火气知识小天地!这里记录生活、工作中的 “小麻烦”,从软件故障到生活难题,我会毫无保留分享解决思路与方法,愿成为你排忧解难时的温暖参考,伴你在解决问题路上稳步前行。 759

LeetCode--150. 逆波兰表达式求值(C++描述)

题目分析 : 本题的解法还是比较简单,定义栈,然后每次将元素入栈,并进行判断,如果是元素的话就需要进行char与int的转换,然后每次从栈顶取出两个元素,进行计算,计算结果放入到栈顶,然后继续进行读入,最终结果会被放在栈顶。输入:tokens = [“10”,“6”,“9”,“3”,“+”,“-11”,“输入:tokens = [“4”,“13”,“5”,“/”,“+”]输入:tokens = [“2”,“1”,“+”,“3”,“*”]逆波兰表达式是一种后缀表达式,所谓后缀就是指算符写在后面。

YGQ_qq_1435471912 264

牛客网:AB4 逆波兰表达式求值

牛客网:AB4 逆波兰表达式求值

newOneObject的博客 226

中缀表达式转后缀表达式(逆波兰式)并且计算结果

原理省去,给出了思路和代码。 思路: (1)中缀表达式转后缀表达式 设一个运算符栈,用来临时存放操作符,一个队列,用来存放生成的后缀表达式。 从左向右扫描中缀表达式,如果遇到操作数num:直接添加num到后缀表达式队列中。 如果遇到的是运算符op1:如果该运算符op1比栈顶运算符优先级高,则把该操作符op1入栈。否则把栈顶的运算符弹出加入到后缀表达式队列中,直到当前栈顶的元素优先级小于op1......

weixin_44520881的博客 971

C语言栈的运用:后缀表达式(逆波兰表达式)计算器

后缀表达式(逆波兰表达式)计算器

CaptainUniverse_的博客 1332
上一篇: 【数据结构】计算机底层是用什么识别算数表达式的?
下一篇: 基于redis+springboot从零开始设计一个类阿里系的单点登录
冷环渊
博客等级 码龄7年 1130粉丝 176原创
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冷环渊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值