* 华为机试的一个题目,整型的四则运算,即+ - * /的运算,考虑优先级,如4+5*9 得到的结果应该是49
*本人采用的是使用两个栈实现的,本程序只供参考思路,有很多其他的情况都没有进行处理,所以程序也比较简单,直接贴代码
package com.huawei.test;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.Stack;
/**
*华为机试的一个题目,整型的四则运算,即+ - * /的运算,考虑优先级,如4+5*9 得到的结果应该是49
*本人采用的是使用两个栈实现的
*
*/
public class Main2 {
public static void main(String args[]){
Scanner sc = new Scanner(System.in);
String test = sc.next();
System.out.println("计算的结果:"+test+"="+calculate(test));
}
public static Map<Character,Integer> map = new HashMap<Character,Integer>();
public static Stack<Integer> s1 = new Stack<Integer>();
public static Stack<Character> s2 = new Stack<Character>();
static{//设置运算符的优先级
map.put('+',1);
map.put('-',1);
map.put('*',2);
map.put('/',2);
map.put('#',0);//作为表达式结束的符号
}
private static int cal(int a1,int a2,char s){//两个数之间的计算,并未可虑3/2=1这种情况,因为机试要求没那么多,当然,解决的办法非常简单,
switch(s){ //把int改为float或者double类型,做点相应的处理就行了
case '+':return a1+a2;
case '-':return a1-a2;
case '*':return a1*a2;
case '/':return a1/a2;
default:return 0;
}
}
private static int calculate(String st){
st = st+"#";
char[] s = st.toCharArray();
int result=0;
for(int i=0;i<s.length;i++){
char p=s[i];
if(p=='+'||p=='-'||p=='*'||p=='/'||p=='#'){//如果为操作符,对栈2进行处理
if(s2.size()<1){
s2.push(p);
}
else if(map.get((Character) s2.peek())>=map.get(p)){//判断优先级别
while(s2.size()>0&&map.get((Character) s2.peek())>=map.get(p)){
int t1 = s1.pop();
int t2 = s1.pop();
result = cal(t2, t1, (Character) s2.peek());
s2.pop();
s1.push(result);
}
s2.push(p);
}
else{
s2.push(p);
}
}
else{//如果为数字的话,放入栈1中
Integer num =Integer.parseInt(new Character(p).toString()) ;
s1.push(num);
}
}
return result;
}
}
运行结果:
这次是华为补招,第一次招聘没投,过两天写华为一面经验......