题解 | #表达式求值#
表达式求值
http://www.nowcoder.com/practice/9566499a2e1546c0a257e885dfdbf30d
//栈中存入数字,最后将栈中的数字相加即得最后结果
//方法1
//先默认为“+”
//看表达式接下来是数字(0-9),运算符(+-*/),优先级("()")
//1、若是运算符,则存入运算符
//2、若是数字,则存入数字,然后用运算符处理数字,如下:此时数字是完整的
// “+”:直接入栈
// “-”:num = -num; 入栈
// “*”:num = 栈顶元素 * num; 入栈
// “/”:num = 栈顶元素 / num; 入栈
//3、若是优先级,找到“(”对应的“)”,然后递归计算括号里的值,得到num,然后按照2的方法处理num
// "(":当再次遇到“(”,计数器+1,当遇到“)”,计数器-1,
// 直到计数器值为0,即找到匹配的“)”
//方法2
//先默认为“+”
//看表达式接下来是数字(0-9),运算符(+-*/),优先级("()")
//1、若是数字,则记住此时的数num,先不入栈(此时数字不一定完整)
//2、若是运算符,如下:先看上一次的运算符
// “+”:直接入栈
// “-”:num = -num; 入栈
// “*”:num = 栈顶元素 * num; 入栈
// “/”:num = 栈顶元素 / num; 入栈
// 存入这次的运算符
// 临时变量 num == 0;
//3、若是优先级,找到“(”对应的“)”,然后递归计算括号里的值,得到num,此时num是完整的,
// "(":当再次遇到“(”,计数器+1,当遇到“)”,计数器-1,
// 直到计数器值为0,即找到匹配的“)”
import java.util.*;
//采用方法2
public class Main {
public static void main(String[] args){
Scanner in = new Scanner (System.in);
String s = in.nextLine();
s = s.replace("[","(");
s = s.replace("{","(");
s = s.replace("]",")");
s = s.replace("}",")");
Main j =new Main();
System.out.println(j.solve(s));
} //main
public int solve(String s){
int len = s.length();
if(s == null || len == 0){ return 0;}
Stack<Integer> st = new Stack<>();
char ops = '+';
int num =0;
for(int i =0; i<len; i++){
char c = s.charAt(i);
if( c == ' ' ){ continue; }
if( Character.isDigit(c) ){
num = num*10 + ( c-'0' );
}
if( c =='(' ){
int j = i+1;//移到小括号后一位
int count = 1;//括号数
while(count>0){
if(s.charAt(j)==')' ){count--;}
if(s.charAt(j)=='(' ){count++;}
j++;
}//while_count
num = solve( s.substring(i+1,j-1) );//括号里的算完
i = j-1;//因为下次循环时,i先+1
}//if_优先级
if(!Character.isDigit(c) && c!='(' || i == len-1 ){
//如果是最后一位,是数字也需要进行这一步
if( ops == '+' ){ st.push(num); }
else if( ops == '-' ){ st.push(-1*num); }
else if( ops == '*' ){ st.push(st.pop()*num); }
else if( ops == '/' ){ st.push(st.pop()/num); }
ops = c;
num = 0;
}//运算符
}//for_i
int ans = 0;
while(!st.isEmpty()){
ans += st.pop();
}
return ans;
}//solve
}//Mian
//方法1
//先默认为“+”
//看表达式接下来是数字(0-9),运算符(+-*/),优先级("()")
//1、若是运算符,则存入运算符
//2、若是数字,则存入数字,然后用运算符处理数字,如下:此时数字是完整的
// “+”:直接入栈
// “-”:num = -num; 入栈
// “*”:num = 栈顶元素 * num; 入栈
// “/”:num = 栈顶元素 / num; 入栈
//3、若是优先级,找到“(”对应的“)”,然后递归计算括号里的值,得到num,然后按照2的方法处理num
// "(":当再次遇到“(”,计数器+1,当遇到“)”,计数器-1,
// 直到计数器值为0,即找到匹配的“)”
//方法2
//先默认为“+”
//看表达式接下来是数字(0-9),运算符(+-*/),优先级("()")
//1、若是数字,则记住此时的数num,先不入栈(此时数字不一定完整)
//2、若是运算符,如下:先看上一次的运算符
// “+”:直接入栈
// “-”:num = -num; 入栈
// “*”:num = 栈顶元素 * num; 入栈
// “/”:num = 栈顶元素 / num; 入栈
// 存入这次的运算符
// 临时变量 num == 0;
//3、若是优先级,找到“(”对应的“)”,然后递归计算括号里的值,得到num,此时num是完整的,
// "(":当再次遇到“(”,计数器+1,当遇到“)”,计数器-1,
// 直到计数器值为0,即找到匹配的“)”
import java.util.*;
//采用方法2
public class Main {
public static void main(String[] args){
Scanner in = new Scanner (System.in);
String s = in.nextLine();
s = s.replace("[","(");
s = s.replace("{","(");
s = s.replace("]",")");
s = s.replace("}",")");
Main j =new Main();
System.out.println(j.solve(s));
} //main
public int solve(String s){
int len = s.length();
if(s == null || len == 0){ return 0;}
Stack<Integer> st = new Stack<>();
char ops = '+';
int num =0;
for(int i =0; i<len; i++){
char c = s.charAt(i);
if( c == ' ' ){ continue; }
if( Character.isDigit(c) ){
num = num*10 + ( c-'0' );
}
if( c =='(' ){
int j = i+1;//移到小括号后一位
int count = 1;//括号数
while(count>0){
if(s.charAt(j)==')' ){count--;}
if(s.charAt(j)=='(' ){count++;}
j++;
}//while_count
num = solve( s.substring(i+1,j-1) );//括号里的算完
i = j-1;//因为下次循环时,i先+1
}//if_优先级
if(!Character.isDigit(c) && c!='(' || i == len-1 ){
//如果是最后一位,是数字也需要进行这一步
if( ops == '+' ){ st.push(num); }
else if( ops == '-' ){ st.push(-1*num); }
else if( ops == '*' ){ st.push(st.pop()*num); }
else if( ops == '/' ){ st.push(st.pop()/num); }
ops = c;
num = 0;
}//运算符
}//for_i
int ans = 0;
while(!st.isEmpty()){
ans += st.pop();
}
return ans;
}//solve
}//Mian