算法训练 表达式计算
Posted 来一点音乐
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法训练 表达式计算相关的知识,希望对你有一定的参考价值。
问题描述
输入一个只包含加减乖除和括号的合法表达式,求表达式的值。其中除表示整除。
输入格式
输入一行,包含一个表达式。
输出格式
输出这个表达式的值。
样例输入
1-2+3*(4-5)
样例输出
-4
数据规模和约定
表达式长度不超过100,表达式运算合法且运算过程都在int内进行。
import java.text.DecimalFormat; import java.text.NumberFormat; import java.util.ArrayList; import java.util.Scanner; import java.util.Stack; public class Main{ public static void main(String[] args){ Scanner input = new Scanner(System.in); String a = input.next(); Stack<Integer> shu = new Stack<Integer>(); Stack<Character> fu = new Stack<Character>(); int index = 0; for(int i=0;i<a.length();i++){ char temp = a.charAt(i); if(temp>=‘9‘||temp>=‘0‘){ index++; }else{ if(index!=0){ shu.push(Integer.parseInt(a.substring(i-index, i))); index = 0; } if(fu.isEmpty()==true){ fu.push(temp); }else if(temp==‘+‘||temp==‘-‘){ while(fu.size()!=0&&fu.peek()!=‘(‘){ int b1 = shu.pop(); int a1 = shu.pop(); shu.push(jisuan(a1,b1,fu.peek())); fu.pop(); } fu.push(temp); }else if(temp==‘*‘||temp==‘/‘){ if(fu.peek()!=‘(‘){ while(fu.peek()==‘*‘||fu.peek()==‘/‘){ int b1 = shu.pop(); int a1 = shu.pop(); shu.push(jisuan(a1,b1,fu.peek())); fu.pop(); fu.push(temp); } fu.push(temp); } else{ fu.push(temp); } } else if(temp==‘(‘){ fu.push(temp); }else if(temp==‘)‘){ while(fu.peek()!=‘(‘){ if(fu.peek()==‘*‘||fu.peek()==‘/‘){ int b1 = shu.pop(); int a1 = shu.pop(); shu.push(jisuan(a1,b1,fu.peek())); fu.pop(); continue; } if(fu.peek()==‘-‘||fu.peek()==‘+‘){ int b1 = shu.pop(); int a1 = shu.pop(); shu.push(jisuan(a1,b1,fu.peek())); fu.pop(); } } fu.pop(); } } } while(fu.size()!=0){ int b1 = shu.pop(); int a1 = shu.pop(); shu.push(jisuan(a1,b1,fu.pop())); } System.out.println(shu.pop()); } public static int jisuan(int a,int b,char c){ int result=0; if(c==‘-‘){ result = a-b; } if(c==‘+‘){ result = a+b; } if(c==‘*‘){ result = a*b; } if(c==‘/‘){ result = a/b; } return result; } }
以上是关于算法训练 表达式计算的主要内容,如果未能解决你的问题,请参考以下文章
代码随想录算法训练营第11天 | ● 20. 有效的括号 ● 1047. 删除字符串中的所有相邻重复项 ● 150. 逆波兰表达式求值