精华内容
下载资源
问答
  • 表达式计算 java 后缀表达式
    2021-02-12 14:03:50

    题目:

    问题描述

    输入一个只包含加减乖除和括号的合法表达式,求表达式的值。其中除表示整除。

    输入格式

    输入一行,包含一个表达式。

    输出格式

    输出这个表达式的值。

    样例输入

    1-2+3*(4-5)

    样例输出

    -4

    数据规模和约定

    表达式长度不超过100,表达式运算合法且运算过程都在int内进行。

    初看此题,从人的直观角度来说很简单,先遍历括号内的运算完再重新遍历,但是很麻烦。

    回忆起了后缀表达式的知识

    中缀表达式转后缀表达式的方法:

    1.遇到操作数:直接输出(添加到后缀表达式中)

    2.栈为空时,遇到运算符,直接入栈

    3.遇到左括号:将其入栈

    4.遇到右括号:执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,左括号不输出。

    5.遇到其他运算符:加减乘除:弹出所有优先级大于或者等于该运算符的栈顶元素,然后将该运算符入栈

    6.最终将栈中的元素依次出栈,输出。

    后缀表达式的计算机求值:

    与前缀表达式类似,只是顺序是从左至右:

    从左至右扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(次顶元素 op 栈顶元素),并将结果入栈;重复上述过程直到表达式最右端,最后运算得出的值即为表达式的结果。

    例如后缀表达式“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,由此得出最终结果。

    一开始,我先把中缀表达式转换为后缀表达式,再对后缀表达式求值。

    有一个很大的问题,数字的保存,转化为后缀表达式时保存为char字符,对于大于9的数字保存很麻烦。

    后来想了想,可以直接借用后缀表达式的计算方法。

    代码如下

    public class Main {

    public static void main(String[] args) {

    // TODO Auto-generated method stub

    Scanner scanner = new Scanner(System.in);

    Stack nums = new Stack(); // 保存数字

    Stack opes = new Stack(); // 保存操作符

    String string = scanner.nextLine();

    int n = 0; // 保存每一个数字

    char[] cs = string.toCharArray();

    for (int i = 0; i < cs.length; i++) {

    char temp = cs[i];

    if (Character.isDigit(cs[i])) {

    n = 10 * n + Integer.parseInt(String.valueOf(cs[i])); // 大于10的数字保存

    } else {

    if (n != 0) {

    nums.push(n);

    n = 0;

    }

    if (temp == '(') {

    opes.push(temp);

    } else if (temp == ')') {

    while (opes.peek() != '(') { // 括号里面运算完

    int t = cal(nums.pop(), nums.pop(), opes.pop());

    nums.push(t);

    }

    opes.pop();

    } else if (isType(temp) > 0) {

    if (opes.isEmpty()) { // 栈为空直接入栈

    opes.push(temp);

    } else {

    // 若栈顶元素优先级大于或等于要入栈的元素,将栈顶元素弹出并计算,然后入栈

    if (isType(opes.peek()) >= isType(temp)) {

    int t = cal(nums.pop(), nums.pop(), opes.pop());

    nums.push(t);

    }

    opes.push(temp);

    }

    }

    }

    }

    // 最后一个字符若是数字,未入栈

    if (n != 0) {

    nums.push(n);

    }

    while (!opes.isEmpty()) {

    int t = cal(nums.pop(), nums.pop(), opes.pop());

    nums.push(t);

    }

    System.out.println(nums.pop());

    }

    // 返回的是运算符的优先级,数字和()不需要考虑

    public static int isType(char c) {

    if (c == '+' || c == '-') {

    return 1;

    } else if (c == '*' || c == '/') {

    return 2;

    } else {

    return 0;

    }

    }

    // 运算次序是反的,跟入栈出栈次序有关

    public static int cal(int m, int n, char c) {

    int sum = -987654321;

    if (c == '+') {

    sum = n + m;

    } else if (c == '-') {

    sum = n - m;

    } else if (c == '*') {

    sum = n * m;

    } else if (c == '/') {

    sum = n / m;

    }

    return sum;

    }

    }

    &lbrack;Swust OJ 322&rsqb;--东6宿舍灵异事件&lpar;中缀表达式转化为后缀表达式的简单运用&rpar;

    题目链接:http://acm.swust.edu.cn/problem/322/ Time limit(ms): 1000 Memory limit(kb): 65535     Descripti ...

    蓝桥杯 ALGO-156 表达式计算 JAVA代码 栈的应用

    算法训练 表达式计算   时间限制:1.0s   内存限制:256.0MB      问题描述 输入一个只包含加减乖除和括号的合法表达式,求表达式的值.其中除表示整除. 输入格式 输入一行,包含一个 ...

    Java堆栈的应用2----------中缀表达式转为后缀表达式的计算Java实现

    1.堆栈-Stack 堆栈(也简称作栈)是一种特殊的线性表,堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置进行插入和删除操作,而堆栈只允许在固定一端进行插入和删除 ...

    《java数据结构与算法》笔记-CH4-8栈结构实现后缀表达式计算结果

    /** * 中缀表达式转换成后缀表达式: 从输入(中缀表达式)中读取的字符,规则: 操作数: 写至输出 左括号: 推其入栈 右括号: 栈非空时重复以下步骤--> * 若项不为(,则写至输出: 若 ...

    数据结构Java实现06----中缀表达式转换为后缀表达式

    本文主要内容: 表达式的三种形式 中缀表达式与后缀表达式转换算法 一.表达式的三种形式: 中缀表达式:运算符放在两个运算对象中间,如:(2+1)*3.我们从小做数学题时,一直使用的就是中缀表达式. 后 ...

    Java数据结构和算法(六)——前缀、中缀、后缀表达式

    前面我们介绍了三种数据结构,第一种数组主要用作数据存储,但是后面的两种栈和队列我们说主要作为程序功能实现的辅助工具,其中在介绍栈时我们知道栈可以用来做单词逆序,匹配关键字符等等,那它还有别的什么功能吗 ...

    java四则运算----前缀、中缀、后缀表达式

    接到一个新需求,需要实现可配置公式,然后按公式实现四则运算. 刚拿到需求,第一反应就是用正则匹配‘(’,‘)’,‘+’,‘-’,‘*’,‘/’,来实现四则运算,感觉不复杂. 然后开始coding.发现 ...

    实现Linux下dc的功能,计算后缀表达式的值

    提交测试截图和码云练习项目链接,实现Linux下dc的功能,计算后缀表达式的值 -将运算符写在两个操作数之后的表达式称为"后缀表达式",如上面的中缀表达式可转换为后缀表达式1 2 ...

    【java】中缀表达式转后缀表达式 java实现

    算法: 中缀表达式转后缀表达式的方法:1.遇到操作数:直接输出(添加到后缀表达式中)2.栈为空时,遇到运算符,直接入栈3.遇到左括号:将其入栈4.遇到右括号:执行出栈操作,并将出栈的元素输出,直到弹出 ...

    随机推荐

    sql 取汉字首字母

    )) ) --用于加密 --WITH ENCRYPTION as begin declare @intLen int ) ) set @intLen = len(@str) set @strRet = ...

    Android基础总结(八)

    服务两种启动方式(掌握) startService 开始服务,会使进程变成为服务进程 启动服务的activity和服务不再有一毛钱关系 bindService 绑定服务不会使进程变成服务进程 绑定服务 ...

    linux shell 字符串操作

    转:http://justcoding.iteye.com/blog/1963463 在做shell批处理程序时候,经常会涉及到字符串相关操作.有很多命令语句,如:awk,sed都可以做字符串各种操作 ...

    &lbrack;bzoj3694&rsqb;最短路

    Description 给出一个$n$个点$m$条边的无向图,$n$个点的编号从$1-n$,定义源点为$1$. 定义最短路树如下:从源点$1$经过边集$T$到任意一点$i$有且仅有一条路径,且这条路径 ...

    grade web的构建约定 convention

    --2015.09.24 当使用gradle构建web应用时: src/main/javasrc/main/resourcessrc/main/webapp/resourcessrc/main/web ...

    java 的Swing

    1.原来的AWT组件来自java.awt包,而AWT组件的java应用程序在不同平台的界面显示不同.但是在不同平台运用Swing开发的应用程序,就可以使用同一的GUI界面. 2.SWing组件通常被称 ...

    BGP基础【第三部】

    静态路由的优点:安全稳定.缺点:配置繁琐不灵活.动态路由的优缺点则反之. BGP边界网关路由协议 路径向量(rip是距离矢量) 到达目的网段所要经过的所有as BGP选路不看度量值而参考13种路径属性 ...

    C&num; 根据路径删除文件或文件夹

    如何根据路径删除文件或文件夹? 1.首先我们要判断路径是文件或者是文件夹 那么我们可以通过 FileAttributes attr = File.GetAttributes(path); 来得到路径的 ...

    FTP配置的一些笔记

    1.必须关闭防火墙 iptables -F iptables -X iptables -Z vi /etc/selinux/config          SELINUX=disabled seten ...

    更多相关内容
  • java使用后缀表达式实现计算器,其中有将一般数学运算式(7-9+5/5-5*6)转换成后缀表达式的方法,以及后缀表达式的求解方法
  • 后缀表达式计算器 代码实现 public class SuffixCulator { public static void main(String[] args) { String infixExpression = "(10+20/2*3)/2+8"; //"10 20 2 / 3 * + 2 / 8 + " //调用中缀转后缀类的方法 ...

    后缀表达式计算器

    代码实现

    public class SuffixCulator {
        public static void main(String[] args) {
            String infixExpression = "(10+20/2*3)/2+8"; //"10 20 2 / 3 * + 2 / 8 + "
    
    		//调用中缀转后缀类的方法
            String suffixExpression = InfixToSuffix.infixToSuffix(infixExpression);
            ArrayStack<Integer> stack = new ArrayStack<>();
            String[] tokens = suffixExpression.split(" ");
            for (String token:tokens) {
                //如果是数字,直接进
                if (isNumber(token)){
                    stack.push(new Integer(token));
                }else {
                    //如果是操作符 则弹出两个数字 进行计算,将结果入栈
                    processAnOperator(stack,token);
                }
            }
            System.out.println(stack.pop());
        }
    
        private static void processAnOperator(ArrayStack<Integer> stack, String token) {
            int num1 = stack.pop();
            int num2 = stack.pop();
            switch (token){
                case "+":
                    stack.push(num2 + num1);
                    break;
                case "-":
                    stack.push(num2 - num1);
                    break;
                case "*":
                    stack.push(num2 * num1);
                    break;
                case "/":
                    stack.push(num2 / num1);
                    break;
            }
    
        }
    
        private static boolean isNumber(String token) {
            return token.matches("\\d+"); // \\d+匹配的是表示多个数字
        }
    }
    
    展开全文
  • 计算后缀表达式的值:1 2 3 + 4 × + 5 - 从左至右扫描,将1,2,3压入栈; 遇到+运算符,3和2弹出,计算2+3的值,得到5,将5压入栈; 遇到4,将4压入栈 遇到×运算符,弹出4和5,计算5×4的值,得到20,将20压入栈...

    实现方法

    1. 从左至右扫描表达式
    2. 遇到数字时,将数字压栈,遇到运算符时,弹出栈顶的两个数,计算并将结果入栈
    3. 重复2直到表达式最右端,最后运算得出的值即为表达式的结果

    示例:

    计算后缀表达式的值:1 2 3 + 4 × + 5 -

    1. 从左至右扫描,将1,2,3压入栈;
    2. 遇到+运算符,3和2弹出,计算2+3的值,得到5,将5压入栈;
    3. 遇到4,将4压入栈
    4. 遇到×运算符,弹出4和5,计算5×4的值,得到20,将20压入栈;
    5. 遇到+运算符,弹出20和1,计算1+20的值,得到21,将21压入栈;
    6. 遇到5,将5压入栈;
    7. 遇到-运算符,弹出5和21,计算21-5的值,得到16为最终结果

    代码实现

    public class ReversePolishNotation {
    
        public static void main(String[] args) {
            String notation = "10 2 3 + 4 * + 5 -";
            ReversePolishNotation reversePN = new ReversePolishNotation();
            Stack<Integer> numStack = new Stack<>();
            //以空格分隔上述表达式,存到数组中
            String[] s = notation.split(" ");
            //遍历数组
            for (int i = 0; i < s.length; i++) {
                if (!reversePN.isOperator(s[i])){
                    //如果不是运算符,则压栈
                    numStack.push(Integer.parseInt(s[i]));
                } else {
                    //为运算符,则取出栈顶的两个数字进行运算
                    int result = reversePN.calculation(numStack.pop(), numStack.pop(), s[i]);
                    //将结果压栈
                    numStack.push(result);
                }
            }
            //循环结束,栈中仅剩的一个元素及为结果
            System.out.println(numStack.pop());
        }
        //判断是否是运算符
        public boolean isOperator(String oper){
            return oper.equals("+") ||oper.equals("-")  ||oper.equals("*")  ||oper.equals("/") ;
        }
        //计算
        public int calculation(int num1, int num2, String oper){
            switch (oper){
                case "+":
                    return num2 + num1;
                case "-":
                    return num2 - num1;
                case "*":
                    return num2 * num1;
                case "/":
                    return num2 / num1;
                default:
                    return 0;
            }
        }
    
    }
    
    展开全文
  • 在上一篇我们已经说过如何计算中缀表达式了,那么这一篇就来说一下如何来计算后缀表达式的值。 后缀表达式呢,要比中缀表达式的计算要容易得多。 和上一次一样,我们先来分析一下过程应该是什么样子呢? 我这里有一...

    在上一篇我们已经说过如何计算中缀表达式了,那么这一篇就来说一下如何来计算后缀表达式的值。
    后缀表达式呢,要比中缀表达式的计算要容易得多。
    和上一次一样,我们先来分析一下过程应该是什么样子呢?

    在这里插入图片描述
    我这里有一个后缀表达式,一个栈,还有分析过程,我们就拿这个表达式来做一下演示。

    我们从左到右扫描,34都是数字直接入栈。
    在这里插入图片描述
    然后遇到运算符+,
    我们弹出栈的两个数并运算,结果入栈。
    在这里插入图片描述
    然后下一个是5,直接入栈。
    再下个是*,依旧弹出两个数,进行运算。结果入栈
    在这里插入图片描述
    然后下个是6,我们直接入栈。
    然后是 - ,我们依旧弹出两个数运算后把结果入栈。
    在这里插入图片描述

    到此时整个表达式我们也扫描完了。
    最后栈剩下的元素就是结果,我们直接pop出就OK。
    这样关于后缀表达式的计算分析也就可以了。

    然后就是代码实现了。
    由于并不是很复杂,所以我直接把写好的代码拿过来吧。``

    package Stack;
    
    import java.util.ArrayList;
    import java.util.Stack;
    
    public class Calculator2 {
        public static void main(String[] args) {
            String str = "34+5*6-";
            System.out.println(complete(str));
        }
    
        public static int complete(String str){
            char arr[] = str.toCharArray();
            int num1 = 0;
            int num2 = 0;
            int oper = 0;
            Stack<Integer> stack = new Stack<Integer>();
            for (int i=0;i<arr.length;i++){
                if (arr[i] == '+'){
                    num1 = stack.pop();
                    num2 = stack.pop();
                    stack.push(num2+num1);
                }else if (arr[i] == '-'){
                    num1 = stack.pop();
                    num2 = stack.pop();
                    stack.push(num2-num1);
                }else if (arr[i] == '*'){
                    num1 = stack.pop();
                    num2 = stack.pop();
                    stack.push(num2*num1);
                }else if (arr[i] == '/'){
                    num1 = stack.pop();
                    num2 = stack.pop();
                    stack.push(num2/num1);
                }else{
                    stack.push(arr[i]-48);
                }
            }
            return stack.pop();
        }
    }
    
    

    OK,这样我们也就做好了。

    总的来讲,后缀表达式的计算要比中缀表达式简单的多,所以在计算器内部计算的时候,我们要把中缀表达式先转换成后缀表达式,在进行这样运算。

    关于中缀表达式转换后缀表达式准备在下一篇来说。
    OK,END。

    展开全文
  • package ...import java.util.ArrayList;import java.util.Stack;import javax.management.RuntimeErrorException;public class CalculatTest {public static void main(String[] args) {ArrayLis...
  • [code="java"... * 表达式 * * @author 风华褚胜--刘胜军 */ import java.util.Arrays; import java.util.Scanner; import java.util.Stack; public class Four { @Suppr...
  • 后缀表达式又称逆波兰表达式,明显的特点是:逆波兰表达式中没有括号,计算时将操作符之前的第一个数作为右操作数,第二个数作为左操作数,进行计算,得到的值继续放入逆波兰表达式中。 但日常生活中我们总是习惯于...
  • 后缀表达式求值 1)后缀表达式又称逆波兰表达式,与前缀表达式相似,只是位于操作数之后 2)举例说明:(3+4)*5-6对应的后缀表达式为3 4 + 5 * 6 - 后缀表达式的计算机求值 从左至右扫描表达式,遇到数字时,将数字...
  • 01 后缀表达式介绍 后缀表达式 这种表示方式把运算符写在运算对象的后面,例如,把a+b写成ab+,所以也称为后缀式。这 02 中缀表达式转后缀表达式 中缀表达式转后缀表达式 初始化两个栈,运算符栈s1和中间...
  • 后缀表达式的计算器Java实现

    千次阅读 2017-05-09 13:42:58
    本文用Java实现了基于后缀表达式的简易计算器
  • 文章目录前缀表达式(波兰表达式)前缀表达式分析与介绍思路分析中缀表达式中缀表达式分析与介绍后缀表达式(逆波兰表达式)后缀表达式分析与介绍思路分析逆波兰计算器代码实现逆波兰计算器中缀表达式转换为后缀...
  • 后缀表达式计算

    2022-01-12 15:01:52
    后缀表达式计算
  • java代码实现中缀表达式转后缀表达式,并计算结果
  • 数学计算的加减乘除人脑算很简单,但是放到计算中却需要进行一些转换,在正式写Java计算数学表达式前,我们需要先来介绍两个概念:前缀表达式、中缀表达式和后缀表达式;(这里的某缀指的是符号的位置) 中缀表达式...
  • java中缀表达式转后缀表达式 转自尚硅谷韩顺平老师课堂内容 public class Calculator { public static void main(String[] args) { //先定义一个逆波兰表达式(3+4)*5-6 =》 3 4 + 5 * 6 —- String ...
  • 文章目录中缀表达式转后缀表达式思路逆波兰表达式计算思路代码实现 中缀表达式转后缀表达式思路 1、初始化两个栈:运算符栈s1和储存中间结果的栈s2 2、从左至右扫描中缀表达式 3、遇到操作数时,将其压入s2 4、遇到...
  • 后缀表达式计算java

    千次阅读 2019-06-16 01:28:27
    准备一个数字栈,一个运算符栈。大致的思路就是遇到,数字直接入数字栈,运算符看优先级进行处理,将要入运算符栈的运算符与栈顶的运算符进行比较,栈顶运算符优先级比较高的话,则把...import java.util.Stack; p...
  • 后缀表达式java实现

    2021-03-13 05:01:24
    中缀表示法java实现观察一个普通的算式:3+4*5我们当然知道,应该先计算 4*5 再将这个结果和3相加,就能得到最后的结果。如果是一个复杂一些的算式:3+4*((5-6)/7+8)这依然难不倒我们,只要牢记()的优先级最高,然后...
  • java计算数学表达式

    2021-02-28 17:05:07
    import java.util.EmptyStackException;...public class CaculateFunction {private static String[] TrnsInToSufix(String IFX)// PFX放后缀表达式,IFX为中缀表达式{String PFX[] = new String[IFX.length(...
  • 计算后缀表达式的值

    千次阅读 2019-09-25 09:14:52
    题目描述 ...计算机计算后缀表达式的过程为,从左到右,遍历表达式,如果当前位是数字,那么先将其暂存,继续往后遍历;如果碰到运算符,那么就取出最近暂存的两个数字,并计算出值,然后将该值继续...
  • [Java教程]如何生成后缀表达式0 2017-02-13 00:00:19如果计算一个表达式,比如 4+5+6*2,随着计算器的不同,简单的四功能计算器是30,许多科学计算器知道乘法的优先级高于加法,所以科学答案是21。典型计算顺序可以...
  • /*中缀表达式转成后缀表达式 "12+((22+31)*4)-5" ==> 12 22 31 + 4 * + 5 -第一步,将中缀表达式转成中缀字符串list,方便遍历 [12, +, (, (, 22, +, 31, ), *, 4, ), -, 5]第二步,将中缀字符串list转成后缀...
  • 1 importjava.util.ArrayList;2 importjava.util.Deque;3 importjava.util.LinkedList;4 importjava.util.List;56 public classMain {7 public static voidmain(String[] args) {8 String str ="11+(2*4...
  • 问题描述给定 N 个加号、M 个减号以及 N + M + 1 个整数 A1,A2,··· ,AN+M+1,小 明想知道在所有由这 N 个加号、M 个减号以及 N + M +1 个整数凑出的合法的 后缀表达式中,结果最大的是哪一个?请你输出这个最大的...
  • 后缀表达式的计算机求值过程:(== 逆波兰表达式==) 从左至右扫描表达式,遇到数字时,就将数字压入栈中,遇到运算符时,就弹出栈顶的两个数字,用运算符对它们做相应的计算(次顶元素和栈顶元素),并将结果入栈;...
  • 前缀表达式中缀表达式后缀表达式之间的转换一、前缀表达式二、使用步骤1.引入库2.读入数据总结 代码实现的工具类ExpressionUtils,类中有两个静态方法,calculateResult方法是实现两数的加减乘除操作,getPriority方法...
  • 计算后缀表达式Java

    2017-10-29 11:06:10
    后缀表达式为二叉树中的后序遍历后写出的表达式 以例题为例子, 12 4 + 13 - 6 2 * += 易知正常顺序为 ((12+4)-13)+(6*2) 使用栈来解这个问题//定义栈的接口 public interface IStack<E> { E push(E ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 30,142
精华内容 12,056
关键字:

java计算后缀表达式

java 订阅