Java实现表达式计算求值
问题描述
输入一个只包含加减乖除和括号的合法表达式,求表达式的值。其中除表示整除。
输入格式
输入一行,包含一个表达式。
输出格式
输出这个表达式的值。
样例输入
1-2+3*(4-5)
样例输出
-4
数据规模和约定
表达式长度不超过100,表达式运算合法且运算过程都在int内进行。
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
Java实现表达式计算求值的更多相关文章
- 算法笔记_044:表达式计算求值(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 输入一个只包含加减乖除和括号的合法表达式,求表达式的值.其中除表示整除. 输入格式 输入一行,包含一个表达式. 输出格式 输出这个表达式的 ...
- C语言对表达式的求值顺序不是明确规定的
讨论区看到的 WA来自那些递归下降求解的代码. 第一种情况,使用|| 和 &&: 例如s为所给串 int getval() { switch(s[c_s++]) { case 'p': ...
- C++ 中缀转后缀表达式并求值
//中缀转后缀 #include<iostream> #include<stack> using namespace std; int prio(char x){ ; ; ; ...
- 中缀表达式转逆波兰式(后缀表达式)求值 C++ Stack
给一个包含小数的中缀表达式 求出它的值 首先转换为后缀表达式然后利用stack求出值 转换规则: 如果字符为'(' push else if 字符为 ')' 出栈运算符直到遇到‘(' else if ...
- Dijkstra的双栈算术表达式的求值算法
例如需要计算 ( 1 + ( ( 2 + 3 ) * ( 4 * 5 ) ) ) 我们以字符串的形式输入该表达式,利用两个栈来完成这个操作,其中一个栈保存运算符,一个栈保存操作数,过程是这样的: 表 ...
- 利用stack结构,将中缀表达式转换为后缀表达式并求值的算法实现
#!/usr/bin/env python # -*- coding: utf-8 -*- # learn <<Problem Solving with Algorithms and Da ...
- 《C++反汇编与逆向分析技术揭秘》——观察各种表达式的求值过程
---恢复内容开始--- 加法: 示例: 常量相加,则在编译期间就计算出两个常量相加后的结果,直接将这个结果参与运算,减少了运行期的计算.当有变量参与运算时,会先取出内存中的数据,放入通用寄存器中,再 ...
- C/C++ 语言中的表达式求值(原文作者:裘宗燕)
经常可以在一些讨论组里看到下面的提问:“谁知道下面C语句给n赋什么值?”m = 1; n = m+++m++;最近有位不相识的朋友发email给我,问为什么在某个C++系统里,下面表达式打印出两个4, ...
- ZT C,C++表达式求值顺序 裘老的解释。 [问题点数:300分]
http://bbs.csdn.net/topics/370153775 [置顶] [推荐] C,C++表达式求值顺序 裘老的解释. [问题点数:300分] 最近这问题有从日经变时经的趋势,这里贴出裘 ...
随机推荐
- uni-app高分开源电影项目源码案例分析,支持一套代码发布小程序、APP平台多个平台(前端入门必看)
uni-app-Video 一个优秀的uni-app案例,旨在帮助大家更快的上手uni-app,共同进步! Features 代码编写简洁,注释清晰,快速入门必备: 支持在线模糊搜索: 程序类目懒 ...
- org.springframework.web.bind.annotation不存在 site:blog.csdn.net(IDEA中运行springboot时报错)
原因:MAVEN版本与IDEA版本不兼容问题, maven虽然更新比较慢,但是最新的3.6.6在与IDEA2019版本及以下版本兼容时会出现以上问题 解决办法:重新配置一个3.6低级别版本的maven ...
- 解决Hystrix dashboard Turbine 一直 Loading…… 及其他坑
问题一.请求 /hystrix.stream 报错,我这里以端口9001为例 请求 http://localhost:9001/hystrix.stream 报404 是因为Srping Boot 2 ...
- vue v-for 渲染input 输入有问题 解决方案
v-for循环input标签的时候输入信息两个输入框一同显示输入信息 解决方案: <input :placeholder="items.title" v-model = &q ...
- 最简单的git 用法
步骤 在机器上ssh-keygen 然后把id_rsa.pub 复制到csdn 的公钥上去. git clone git@code.csdn.net:aca_jingru/zabbix.git 如果这 ...
- chosen.jquery.min.js select2.js 弊端
chosen.jquery.min.js --将select放在页面最下方,会导致页面高度增加,最下方空白多出来 select2.js --点击select 但未选择,然后移出鼠标,发现其他文本框.关 ...
- 大清朝早亡了,还没有入门 Spring Boot?
由于读者的数量越来越多,难免会被问到一些我自己都觉得不好意思的问题,比如说前几天小王就问我:"二哥,快教教我,怎么通过 Spring Boot 创建一个 Hello World 项目啊?&q ...
- CF55D
题目大意: 定义:beautiful number,一种能整除它的所有非 0 数位的数字. 给你 l 和 r,请求出 [l,r] 中 beautiful number 的个数. 解题思路: 数位 DP ...
- hide handkerchief(hdu2104)
思考:这种找手绢就是,在判断是否互质.用辗转相除法(用来求最大公约数:a)进行判断.r=a%b;a=b;b=r;循环限制条件:除数b=0是结束除法.如果这时被除数a=1,则表示两个互质. #inclu ...
- 【Java】面试官灵魂拷问:if语句执行完else语句真的不会再执行吗?
写在前面 最近跳槽找工作的朋友确实不少,遇到的面试题也是千奇百怪,这不,一名读者朋友面试时,被面试官问到了一个直击灵魂的问题:if 语句执行完else语句真的不会再执行吗?这个奇葩的问题把这名读者问倒 ...