条件表达式求值
描述: 给定一个以字符串形式表示的算术表达式,计算该表达式的值。
表达式支持如下运算:“+、-、*、/”,其中“*”和“/”的优先级要高于“+”和“-”;
不需要考虑括号,且表达式之间没有空格;
例如:对于表达式"3-2+15*2",该表达式值为31.
运行时间限制: 60 Sec
内存限制: 256 MByte
输入: 加减乘除四则运算表达式,长度不超过1024字节,运算式中不含有括号和空格。
输出: 表达式的运算结果。
样例输入: 3-2+15*2
解法二:
描述: 给定一个以字符串形式表示的算术表达式,计算该表达式的值。
表达式支持如下运算:“+、-、*、/”,其中“*”和“/”的优先级要高于“+”和“-”;
不需要考虑括号,且表达式之间没有空格;
例如:对于表达式"3-2+15*2",该表达式值为31.
运行时间限制: 60 Sec
内存限制: 256 MByte
输入: 加减乘除四则运算表达式,长度不超过1024字节,运算式中不含有括号和空格。
输出: 表达式的运算结果。
样例输入: 3-2+15*2
样例输出: 31
解法一:
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.util.ArrayList;
public class ConditionalExpressCal{
public static void main(String[] args)throws Exception{
//1读取输入的表达式
InputStreamReader irs = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(irs);
String express = br.readLine();
//2将表达式中的数值分割出来
String[] valueS = express.split("\\+|-|\\*|/");
ArrayList<Integer> valueArrayList = new ArrayList<Integer>();
ArrayList<Integer> valueArrayList1 = new ArrayList<Integer>();
for(String s: valueS){
int n = Integer.parseInt(s);
valueArrayList.add(n);
}
//3将表达式中的操作符分割出来
ArrayList<Character> opsArrayList = new ArrayList<Character>();
ArrayList<Character> opsArrayList1 = new ArrayList<Character>();
for(int i =0;i<express.length();i++){
char ops = express.charAt(i);
if(ops == '+' || ops == '-' || ops == '*' || ops == '/'){
opsArrayList.add(ops);
}
}
//4循环表达式,将表达式中所以的*或/的式子进行计算
int index = 0;
flag:while(index < opsArrayList.size()){//这个while的条件可以一直为true;
//5找到第一个*或/的位置startIndex。如果没有则跳出循环
char c = opsArrayList.get(index);
while( c != '*' && c != '/'){
index++;
if(index >= opsArrayList.size()){
break flag;//break flag 可以跳出两次层循环的。就是跳出flag的位置。表明该表达式中没有*或/。
}
c = opsArrayList.get(index);
}
int startIndex = index;
//6找到连续几个*或/的最后一个位置endIndex;
c = opsArrayList.get(startIndex);
while( c == '*' || c == '/'){
index++;
if(index >= opsArrayList.size()){
break;//跳出本while循环,表明找到最后一个操作符,进行7的子表达式计算
}
c = opsArrayList.get(index);
}
int endIndex = index-1;
//7对这个*或/的子表达式进行计算,得出结果sum
int sum = valueArrayList.get(startIndex);
for(int i = startIndex;i<= endIndex;i++){
char cops = opsArrayList.get(i);
if(cops == '*'){
sum *= valueArrayList.get(i+1);
}else if(cops == '/'){
sum = sum / valueArrayList.get(i+1);
}
}
//8删除刚计算的子表达式中的操作数以及操作符。并把结果sum放入第一个操作数的位置startIndex
for(int i = 1;i<= (endIndex-startIndex)+1;i++){
opsArrayList.remove(startIndex);
valueArrayList.remove(startIndex);
}
valueArrayList.remove(startIndex);
valueArrayList.add(startIndex,sum);
}
//9将得到的只包含+或-表达式进行计算
int result = valueArrayList.get(0);
for(int i=0;i<opsArrayList.size();i++){
char cops = opsArrayList.get(i);
if(cops == '+'){
result += valueArrayList.get(i+1);
}else if(cops == '-'){
result -= valueArrayList.get(i+1);
}
}
System.out.println(result);
}
}
解法二:
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.util.ArrayList;
public class ConditionalExpressCal1{
public static void main(String[] args)throws Exception{
//1读取输入的表达式
InputStreamReader irs = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(irs);
String express = br.readLine();
//2将表达式中的数值分割出来
String[] valueS = express.split("\\+|-|\\*|/");
ArrayList<Integer> valueArrayList = new ArrayList<Integer>();
for(String s: valueS){
int n = Integer.parseInt(s);
valueArrayList.add(n);
}
//3将表达式中的操作符分割出来
ArrayList<Character> opsArrayList = new ArrayList<Character>();
for(int i =0;i<express.length();i++){
char ops = express.charAt(i);
if(ops == '+' || ops == '-' || ops == '*' || ops == '/'){
opsArrayList.add(ops);
}
}
//4调用calfunction方法
CalFunction(valueArrayList,opsArrayList);
}
public static void CalFunction(ArrayList<Integer> intArrayList,ArrayList<Character> charArrayList){
//5获得操作数和操作符
ArrayList<Integer> valueArrayList = new ArrayList<Integer>();
ArrayList<Character> opsArrayList = new ArrayList<Character>();
for(int n : intArrayList){
valueArrayList.add(n);
}
for(char c: charArrayList){
opsArrayList.add(c);
}
//6至少有两个操作符时,第一个操作符是*或/时,对第一个操作符进行计算
if(opsArrayList.size()>1){
char ops = opsArrayList.get(0);
while( ops == '*' || ops == '/'){
if(opsArrayList.size() == 1){
break;
}
int value1 = valueArrayList.get(0);
int value2 = valueArrayList.get(1);
if(ops == '*'){
value1 = value1 * value2;
}else if(ops == '/'){
value1 = value1 / value2;
}
valueArrayList.remove(0);
valueArrayList.remove(0);
opsArrayList.remove(0);
valueArrayList.add(0,value1);
System.out.print(valueArrayList.get(0)+"");
System.out.println(opsArrayList.size());
ops = opsArrayList.get(0);
}
}
//7至少有两个操作符时,第一个操作符是+或-且第二个为*或/时,对第二个操作符进行计算
if(opsArrayList.size()>1){
char ops = opsArrayList.get(0);
char opsOther = opsArrayList.get(1);
while( (ops == '+' || ops == '-') && (opsOther == '*' || opsOther == '/') ){
int value1 = valueArrayList.get(1);
int value2 = valueArrayList.get(2);
if(opsOther == '*'){
value1 = value1 * value2;
}else if(opsOther == '/'){
value1 = value1 / value2;
}
valueArrayList.remove(1);
valueArrayList.remove(1);
opsArrayList.remove(1);
valueArrayList.add(1,value1);
if(opsArrayList.size() < 2){
break;
}
System.out.println(valueArrayList.get(1)+"");
System.out.println(opsArrayList.size());
opsOther = opsArrayList.get(1);
}
}
//8至少有两个操作符时,第一个操作符是+或-且第二个是+或—时,对第一个操作符进行操作
if(opsArrayList.size()>1){
char ops = opsArrayList.get(0);
char opsOther = opsArrayList.get(1);
while( (ops == '+' || ops == '-') && (opsOther == '+' || opsOther == '-') ){
int value1 = valueArrayList.get(0);
int value2 = valueArrayList.get(1);
if(ops == '+'){
value1 = value1 + value2;
}else if(ops == '-'){
value1 = value1 - value2;
}
valueArrayList.remove(0);
valueArrayList.remove(0);
opsArrayList.remove(0);
valueArrayList.add(0,value1);
if(opsArrayList.size() < 2){
break;
}System.out.println(valueArrayList.get(0)+"");
System.out.print(opsArrayList.size());
ops = opsArrayList.get(0);
opsOther = opsArrayList.get(1);
}
}
//9剩下只有一个操作符时,直接进行计算
if(opsArrayList.size() == 1){
char ops = opsArrayList.get(0);
int value1 = valueArrayList.get(0);
int value2 = valueArrayList.get(1);
System.out.println(value1+" "+value2);
System.out.println(ops+"");
if(ops == '+'){
value1 = value1 + value2;
}else if(ops == '-'){
value1 = value1 - value2;
}else if(ops == '*'){
value1 = value1 * value2;
}else if(ops == '/'){
value1 = value1 / value2;
}
for(int n : valueArrayList){
System.out.print(n);
}
System.out.println();
System.out.println(valueArrayList.size()+"value1"+value1);
valueArrayList.remove(0);
valueArrayList.remove(0);
System.out.println(valueArrayList.size()+"value1"+value1);
for(int n : valueArrayList){
System.out.print(n);
}
opsArrayList.remove(0);
valueArrayList.add(0,value1);
System.out.println(valueArrayList.size()+"value1"+value1);
System.out.println(opsArrayList.size()+"opssize");
for(int n : valueArrayList){
System.out.println(n);
}
System.out.println(valueArrayList.get(0)+"");
}
}
//6,7,8,9的顺序不能乱,因为计算有优先级的。
}
两个程序都可以优化的,而且也需要优化的