目录

1 问题描述

2 解决方案

 


1 问题描述

问题描述
  输入一个只包含加减乖除和括号的合法表达式,求表达式的值。其中除表示整除。
输入格式
  输入一行,包含一个表达式。
输出格式
  输出这个表达式的值。
样例输入
1-2+3*(4-5)
样例输出
-4
数据规模和约定
  表达式长度不超过100,表达式运算合法且运算过程都在int内进行。

2 解决方案

具体代码如下:

package com.liuzhen.systemExe;import java.util.Scanner;
import java.util.Stack;public class Main{//计算表达式的值public void getExpressionValue(String A){char[] arrayA = A.toCharArray();Stack<Integer> Value = new Stack<Integer>();      //存放运算数字及表达式计算结果Stack<Character> Operator =  new Stack<Character>();   //存放运算符for(int i = 0;i < A.length();i++){int temp = 0;if(arrayA[i] >= '0' && arrayA[i] <= '9'){temp = arrayA[i] - '0';i = i + 1;while(i < A.length() && arrayA[i] >= '0' && arrayA[i] <= '9'){temp = temp * 10 + (arrayA[i] - '0');i++;}i--;     //对应上面一句i = i+1;因为在for循环中有i++自增操作,若不执行此句,会导致i自增两次
                Value.push(temp);}else{if(Operator.empty()){Operator.push(arrayA[i]);}else{char temp1 = Operator.pop();   //进栈前,存放运算符栈中栈顶存放字符int judge = comparePriority(temp1,arrayA[i]);  //比较当前字符与栈顶字符优先级if(judge == 1){           //当前字符优先级小于栈顶字符int tempA = Value.pop();int tempB = Value.pop();int result = computeNumber(tempB,tempA,temp1);Value.push(result);Operator.push(arrayA[i]);}if(judge == 0){           //当前字符优先级大于栈顶字符
                        Operator.push(temp1);Operator.push(arrayA[i]);}if(judge == 2){  //字符')'遇到'(',刚好使得'('出栈System.out.println("'('刚好遇到')'");   //这种情况也应该不会出现,按照给定优先级,')'一般会先遇到+、-、*、/字符
                    }if(judge == 3){   //此时')'刚好准备进栈while(temp1 != '('){          //')'字符要等到第一个'('出栈才能结束循环//System.out.println(temp1);int tempA = Value.pop();int tempB = Value.pop();int result = computeNumber(tempB,tempA,temp1);Value.push(result);temp1 = Operator.pop();  }}if(judge == -1){    //此时,说明当前栈顶字符为')',这是不存在的,因为遇到')',按要求不让进栈System.out.println("出现栈顶有')'错误!!!");}}}}while(!Operator.empty() && !Value.empty()){   //此时,字符栈中还存在运算符的情况char temp1 = Operator.pop();int tempA = Value.pop();int tempB = Value.pop();int result = computeNumber(tempB,tempA,temp1);Value.push(result);}System.out.println(Value.pop());   //此时运算符栈为空,数字栈中只存在表达式计算最终结果
    }//计算a operator b的值,operator = {+,-,*,/}public int computeNumber(int a,int b,char operator){int result;switch(operator){case '+': result = a+b;break;case '-':result = a-b;break;case '*': result = a*b;break;case '/': result = a/b;break;        default:  result = 0;break;}return result;}//判断运算符a和b的优先级public int comparePriority(char a,char b){//使用二维数组表达运算符之间的优先级,行用字符a表示,列用字符b表示int[][] Value = {{1,1,0,0,0,3},{1,1,0,0,0,3},{1,1,1,1,0,3},{1,1,1,1,0,3},{0,0,0,0,0,2},{-1,-1,-1,-1,-1,-1}};int i = 0;int j = 0;if(a == '+')i = 0;if(a == '-')i = 1;if(a == '*')i = 2;if(a == '/')i = 3;if(a == '(')i = 4;if(a == ')')i = 5;if(b == '+')j = 0;if(b == '-')j = 1;if(b == '*')j = 2;if(b == '/')j = 3;if(b == '(')j = 4;if(b == ')')j = 5;return Value[i][j];}public static void main(String[] args){Main test = new Main(); Scanner in = new Scanner(System.in);System.out.println("请输入一个算法表达式:");String A = in.nextLine();test.getExpressionValue(A);}
}

运行结果:

请输入一个算法表达式:
1-2+3*(4-5)
-4请输入一个算法表达式:
1-2*((2+3)*2-(2+3))
-9请输入一个算法表达式:
1-2*((2+3)*(2+3))
-49

算法笔记_044:表达式计算求值(Java)相关推荐

  1. c语言中缀表达式求值_[源码和文档分享]基于C++的表达式计算求值

    一.使用说明 1.1 项目简介 表达式求值是程序设计语言编译中的一个最基本的问题,就是将一个表达式转化为逆波兰表达式并求值.具体要求是以字符序列的形式从终端输入语法正确的.不含变量的整数表达式,并利用 ...

  2. [算法 笔记]字符串表达式计算(简易版)

    题目:编写一个函数,计算字符串中表达式的值,参数中只包含计算符:+,-,*,/等.例如,str="10+50+2*6/3",result=64. 解析: 考虑算术表达式计算规则: ...

  3. ffmpeg文档08-表达式计算/求值

    8 表达式计算/求值 在计算表达式时,ffmpeg通过libavutil/eval.h接口调用内部计算器进行计算. 表达式可以包含一元运算符.运算符.常数和函数 两个表达式expr1和expr2可以组 ...

  4. 前缀中缀后缀表达式的计算求值

    原文在这里 表达式 前缀表达式(波兰表达式) 前缀表达式又称波兰式,前缀表达式的运算符位于操作数之前 举例说明: (3+4)×5-6 对应的前缀表达式就是 - × + 3 4 5 6 前缀表达式求值 ...

  5. 【swjtu】数据结构实验2_中缀表达式的求值算法

    实验内容及要求: 从键盘输入中缀表达式,建立操作数与运算符堆栈,计算并输出表达式的求值结果. 基本要求:实现 +, -, *, /四个二元运算符以及():操作数范围为0至9. 提高要求:实现+, -两 ...

  6. C/C++ 语言中表达式的求值

    作者:裘宗燕    北京大学数学学院信息科学系    本文基本内容发表于<编程高手>杂志 2004 年第 12 期 经常可以在一些讨论组里看到下面的提问:"谁知道下面 C 语句给 ...

  7. C/C++ 语言中表达式的求值

    原文http://www.math.pku.edu.cn/teachers/qiuzy/technotes/expression2009.pdf C/C++ 语言中表达式的求值  裘宗燕  北京大学数 ...

  8. C++——算术表达式的求值(数据结构课程设计)

    数据结构课程设计--算术表达式的求值 1.实验目的 1.在课程设计中提高学生的动手能力和编程能力; 2.在课程设计中提高数据结构中理论知识(栈和二叉树等知识)的应用. 3.在课程设计中提高自己对各个方 ...

  9. 使用堆栈实现对算数四则混合运算表达式的求值(C语言)

    使用堆栈实现对算数四则混合运算表达式的求值(C语言) 很方便的目录 使用堆栈实现对算数四则混合运算表达式的求值(C语言) 一.问题分析 基本思路 算符优先级构建 二.算法描述 算法描述 堆栈运算过程的 ...

最新文章

  1. 【加强版】js原生实现拖拽效果,这次没有用document的mousedown、mousemove、mouseup事件我们来点实际的(但是有个弊端:拖拽过程中鼠标会变成一个禁用符号,不太友好)
  2. 【迁移学习(Transfer L)全面指南】零次学习(Zero-Shot Learning)入门
  3. C++ Primer 5th笔记(chap 16 模板和泛型编程)类模板和友元
  4. 通过NetMassDownloader批量下载和使用微软.NET框架源代码
  5. 安装oracle 11g 客户端,检查过程中报物理内存不足的解决
  6. 2021-11-06深度学习
  7. (转)基于Metronic的Bootstrap开发框架经验总结(9)--实现Web页面内容的打印预览和保存操作...
  8. 2015年8月27日--培训作业是几个练习题
  9. PHP获取当前脚本内存占用情况
  10. 标准化考点考场高考英语听力广播系统解决方案
  11. 性格测试系统v1.0
  12. 小企业会计准则 ——主要账务处理和财务报表(2)
  13. border-sizing属性
  14. Cannot start container web: iptables failed: iptables -t nat -A DOCKER -p tcp -d 0/0 --dport 32797
  15. Github连接不上怎么办?
  16. 支付结算周期:D0 D1 T0 T1的区别
  17. 怎么把图片的边缘弄圆_怎么把图片边角变圆?
  18. 算法入门四:函数与函数体:
  19. html七彩文本,小程序解析富文本---文本内容(不含图片)
  20. Deepin下在线安装和使用ClamAV

热门文章

  1. GDCM:目录条目的测试程序
  2. DCMTK:创建,编写和读取细分对象
  3. VTK:可视化之Hawaii
  4. VTK:网格之QuadricClustering
  5. C语言用warshall算法求传递闭包transitive closure(附完整源码)
  6. QT的QHttpMultiPart类的使用
  7. QT的QBrush类的使用
  8. QML基础类型之vector2d
  9. 经典C语言程序100例之六四
  10. css 渐变色_如何设置渐变色的单元格值?