问题描述

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

输入格式

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

输出格式

  输出这个表达式的值。

样例输入

1-2+3*(4-5)

样例输出

-4

数据规模和约定

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

  1. package com.liuzhen.systemExe;
  2. import java.util.Scanner;
  3. import java.util.Stack;
  4. public class Main{
  5. //计算表达式的值
  6. public void getExpressionValue(String A){
  7. char[] arrayA = A.toCharArray();
  8. Stack<Integer> Value = new Stack<Integer>(); //存放运算数字及表达式计算结果
  9. Stack<Character> Operator = new Stack<Character>(); //存放运算符
  10. for(int i = 0;i < A.length();i++){
  11. int temp = 0;
  12. if(arrayA[i] >= '0' && arrayA[i] <= '9'){
  13. temp = arrayA[i] - '0';
  14. i = i + 1;
  15. while(i < A.length() && arrayA[i] >= '0' && arrayA[i] <= '9'){
  16. temp = temp * 10 + (arrayA[i] - '0');
  17. i++;
  18. }
  19. i--; //对应上面一句i = i+1;因为在for循环中有i++自增操作,若不执行此句,会导致i自增两次
  20. Value.push(temp);
  21. }
  22. else{
  23. if(Operator.empty()){
  24. Operator.push(arrayA[i]);
  25. }
  26. else{
  27. char temp1 = Operator.pop(); //进栈前,存放运算符栈中栈顶存放字符
  28. int judge = comparePriority(temp1,arrayA[i]); //比较当前字符与栈顶字符优先级
  29. if(judge == 1){ //当前字符优先级小于栈顶字符
  30. int tempA = Value.pop();
  31. int tempB = Value.pop();
  32. int result = computeNumber(tempB,tempA,temp1);
  33. Value.push(result);
  34. Operator.push(arrayA[i]);
  35. }
  36. if(judge == 0){ //当前字符优先级大于栈顶字符
  37. Operator.push(temp1);
  38. Operator.push(arrayA[i]);
  39. }
  40. if(judge == 2){ //字符')'遇到'(',刚好使得'('出栈
  41. System.out.println("'('刚好遇到')'"); //这种情况也应该不会出现,按照给定优先级,')'一般会先遇到+、-、*、/字符
  42. }
  43. if(judge == 3){ //此时')'刚好准备进栈
  44. while(temp1 != '('){ //')'字符要等到第一个'('出栈才能结束循环
  45. //System.out.println(temp1);
  46. int tempA = Value.pop();
  47. int tempB = Value.pop();
  48. int result = computeNumber(tempB,tempA,temp1);
  49. Value.push(result);
  50. temp1 = Operator.pop();
  51. }
  52. }
  53. if(judge == -1){ //此时,说明当前栈顶字符为')',这是不存在的,因为遇到')',按要求不让进栈
  54. System.out.println("出现栈顶有')'错误!!!");
  55. }
  56. }
  57. }
  58. }
  59. while(!Operator.empty() && !Value.empty()){ //此时,字符栈中还存在运算符的情况
  60. char temp1 = Operator.pop();
  61. int tempA = Value.pop();
  62. int tempB = Value.pop();
  63. int result = computeNumber(tempB,tempA,temp1);
  64. Value.push(result);
  65. }
  66. System.out.println(Value.pop()); //此时运算符栈为空,数字栈中只存在表达式计算最终结果
  67. }
  68. //计算a operator b的值,operator = {+,-,*,/}
  69. public int computeNumber(int a,int b,char operator){
  70. int result;
  71. switch(operator){
  72. case '+':
  73. result = a+b;
  74. break;
  75. case '-':
  76. result = a-b;
  77. break;
  78. case '*':
  79. result = a*b;
  80. break;
  81. case '/':
  82. result = a/b;
  83. break;
  84. default:
  85. result = 0;
  86. break;
  87. }
  88. return result;
  89. }
  90. //判断运算符a和b的优先级
  91. public int comparePriority(char a,char b){
  92. //使用二维数组表达运算符之间的优先级,行用字符a表示,列用字符b表示
  93. int[][] Value = {{1,1,0,0,0,3},
  94. {1,1,0,0,0,3},
  95. {1,1,1,1,0,3},
  96. {1,1,1,1,0,3},
  97. {0,0,0,0,0,2},
  98. {-1,-1,-1,-1,-1,-1}};
  99. int i = 0;
  100. int j = 0;
  101. if(a == '+')
  102. i = 0;
  103. if(a == '-')
  104. i = 1;
  105. if(a == '*')
  106. i = 2;
  107. if(a == '/')
  108. i = 3;
  109. if(a == '(')
  110. i = 4;
  111. if(a == ')')
  112. i = 5;
  113. if(b == '+')
  114. j = 0;
  115. if(b == '-')
  116. j = 1;
  117. if(b == '*')
  118. j = 2;
  119. if(b == '/')
  120. j = 3;
  121. if(b == '(')
  122. j = 4;
  123. if(b == ')')
  124. j = 5;
  125. return Value[i][j];
  126. }
  127. public static void main(String[] args){
  128. Main test = new Main();
  129. Scanner in = new Scanner(System.in);
  130. System.out.println("请输入一个算法表达式:");
  131. String A = in.nextLine();
  132. test.getExpressionValue(A);
  133. }
  134. }

运行结果:

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

Java实现表达式计算求值的更多相关文章

  1. 算法笔记_044:表达式计算求值(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 输入一个只包含加减乖除和括号的合法表达式,求表达式的值.其中除表示整除. 输入格式 输入一行,包含一个表达式. 输出格式 输出这个表达式的 ...

  2. C语言对表达式的求值顺序不是明确规定的

    讨论区看到的 WA来自那些递归下降求解的代码. 第一种情况,使用|| 和 &&: 例如s为所给串 int getval() { switch(s[c_s++]) { case 'p': ...

  3. C++ 中缀转后缀表达式并求值

    //中缀转后缀 #include<iostream> #include<stack> using namespace std; int prio(char x){ ; ; ; ...

  4. 中缀表达式转逆波兰式(后缀表达式)求值 C++ Stack

    给一个包含小数的中缀表达式 求出它的值 首先转换为后缀表达式然后利用stack求出值 转换规则: 如果字符为'('  push else if 字符为 ')' 出栈运算符直到遇到‘(' else if ...

  5. Dijkstra的双栈算术表达式的求值算法

    例如需要计算 ( 1 + (  ( 2 + 3 ) * ( 4 * 5 ) ) ) 我们以字符串的形式输入该表达式,利用两个栈来完成这个操作,其中一个栈保存运算符,一个栈保存操作数,过程是这样的: 表 ...

  6. 利用stack结构,将中缀表达式转换为后缀表达式并求值的算法实现

    #!/usr/bin/env python # -*- coding: utf-8 -*- # learn <<Problem Solving with Algorithms and Da ...

  7. 《C++反汇编与逆向分析技术揭秘》——观察各种表达式的求值过程

    ---恢复内容开始--- 加法: 示例: 常量相加,则在编译期间就计算出两个常量相加后的结果,直接将这个结果参与运算,减少了运行期的计算.当有变量参与运算时,会先取出内存中的数据,放入通用寄存器中,再 ...

  8. C/C++ 语言中的表达式求值(原文作者:裘宗燕)

    经常可以在一些讨论组里看到下面的提问:“谁知道下面C语句给n赋什么值?”m = 1; n = m+++m++;最近有位不相识的朋友发email给我,问为什么在某个C++系统里,下面表达式打印出两个4, ...

  9. ZT C,C++表达式求值顺序 裘老的解释。 [问题点数:300分]

    http://bbs.csdn.net/topics/370153775 [置顶] [推荐] C,C++表达式求值顺序 裘老的解释. [问题点数:300分] 最近这问题有从日经变时经的趋势,这里贴出裘 ...

随机推荐

  1. spring junit--基础配置

    spring官方文档总提示要进行SpringJunit测试必须先配置两个信息: 1.使用Spring IOC功能配置 2.配置正确的JDBC或ORM框架连接数据库 下面进行spring3和hibern ...

  2. 小程序使用模板template

    小程序使用模板template 1.介绍:模板就是代码的高度复用,将在很多页面使用了相同的部分可以使用模板封装 <!-- 在页面组件中使用 --> <!-- 此时定义了一个模板 -- ...

  3. react中控制元素的显示与隐藏

    1.通过 state 变量来控制是否渲染元素 类似于 vue 的 v-if 方法是通过变量来控制是否加载元素的,如果变量为false,内容就直接不会渲染的. class Demo extends Re ...

  4. poj2762 判断一个图中任意两点是否存在可达路径 也可看成DAG的最小覆盖点是否为1

      Going from u to v or from v to u? Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 179 ...

  5. 设计模式系列之单例模式(Singleton Pattern)——确保对象的唯一性

    模式概述 模式定义 模式结构图 饿汉式单例与懒汉式单例 饿汉式单例 懒汉式单例 模式应用 模式在JDK中的应用 模式在开源项目中的应用 模式总结 主要优点 适用场景 说明:设计模式系列文章是读刘伟所著 ...

  6. 首字母变大写(hdu2026)

    输入方式:直接循环输入带有空格的未知长度的字符串. 思考:直接循环输入带有空格的未知长度的字符串,用while(gets_s())函数,循环内外不用getchar()函数.(注意,每次字符串以整体输入 ...

  7. var、let、const三者的区别

    var定义的变量,没有块的概念,可以跨块访问, 不能跨函数访问. let定义的变量,只能在块作用域里访问,不能跨块访问,也不能跨函数访问. const用来定义常量,使用时必须初始化(即必须赋值),只能 ...

  8. Python所有异常错误的父类--BaseException

    BaseException # 所有异常的基类 +-- SystemExit # 解释器请求退出 +-- KeyboardInterrupt # 用户中断执行(通常是输入^C) +-- Generat ...

  9. nvm的安装,安装node,npm

    先说说我为什么使用nvm吧 最近在搞react-native,就碰到了很多坑,其中就有node带来的坑,当你运行react-native start (这是rn启动服务器的命令)就会报一个正则的错误, ...

  10. 一、React初体验之NodeJS环境搭建

    一.NodeJS安装 我博客中有相关文章,此处不再赘述. 二.相关模块安装 在使用React的时候需要安装一些相关模块: 1.babel npm install babel -g --save-dev ...