题目:实现一个一位数字的四则运算计算函数,输入是一个char数组,输出是计算结果。
比如输入是char[] inputs = {'1','+','2','*','3'},输出是7。输入的字符里面,如果是数字,则只有一位;如果是符号,则只有加减乘除四个运算符,没有括号
答案:
/**
* 确定操作符优先级
* @param first
* @param second
* @return
*/
public static boolean highPriority(char first, char second){
return (second == '*' || second == '/') && (first == '+' || first == '-');
}
/**
* 计算放值
* @param num
* @param operate
*/
public static void calculate(Stack<Integer> num, char operate){
switch (operate){
case '+':
num.add(num.pop()+num.pop());
break;
case '-':
Integer pop = num.pop();
num.add(num.pop() - pop);
break;
case '*':
num.add(num.pop()*num.pop());
break;
case '/':
Integer div = num.pop();
num.add(num.pop()/div);
break;
}
}
public static int cal(char[] input){
//新建一个栈放置数组中的数字
Stack<Integer> calResult = new Stack<>();
//新建一个栈放置操作符
Stack<Character> operation = new Stack<>();
//一次循环将所有值分别放置到两个栈中
for(Character c : input){
//判断这个字符是不是数字,要是数字就放置在数字栈中
if(Character.isDigit(c)){
calResult.add(c-'0');
}else{
//若获取的字符是操作符,则先判断操作符栈是否为空,若不为空则判断操作符的优先级
//若操作符栈顶元素优先级高于当前操作符,则先进行数据计算操作,一直到栈顶元素优先级和当前操作符相同,或者低于的。
while(!operation.empty() && !highPriority(operation.peek(),c)){
calculate(calResult,operation.pop());
}
//若操作符栈顶元素优先级低于当前操作符,直接放进去
operation.add(c);
}
}
//一轮循环结束,剩下的都是加减,直接进行计算即可
while (!operation.empty()){
calculate(calResult,operation.pop());
}
return calResult.pop();
}