华为编程题之七:条件表达式求值

条件表达式求值 
描述: 给定一个以字符串形式表示的算术表达式,计算该表达式的值。
表达式支持如下运算:“+、-、*、/”,其中“*”和“/”的优先级要高于“+”和“-”;
不需要考虑括号,且表达式之间没有空格;
例如:对于表达式"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的顺序不能乱,因为计算有优先级的。
}
两个程序都可以优化的,而且也需要优化的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值