数学运算相关
解析带括号的算数表达式
import java.util.Stack;
public class Example3_3 {
public String converToPostfix(String expression)throws Exception{
Stack<Character> st=new Stack<>();
String postfix=new String();
for(int i=0;expression!=null&&i<expression.length();i++){
char c=expression.charAt(i);
if(' '!=c){
if(isOpenParent(c)){
st.push(c);
}
else if(isCloseParent(c)){
char ac=st.pop();
while(!isOpenParent(ac)){
postfix=postfix.concat(String.valueOf(ac));
ac=st.pop();
}
}
else if(isOperator(c)){
if(!st.empty()){
char ac=st.pop();
while(!st.isEmpty()&&priority(ac)>=priority(c)){
postfix=postfix.concat(String.valueOf(ac));
ac=st.pop();
}
if(ac!=' '){
st.push(ac);
}
}st.push(c);
}
else {
postfix=postfix.concat(String.valueOf(c));
}
}
}
while(!st.isEmpty()){
postfix=postfix.concat(String.valueOf(st.pop()));
}
return postfix;
}
public double numberCalculate(String postfix)throws Exception{
Stack st=new Stack<>();
for(int i=0;postfix!=null&&i<postfix.length();i++){
char c=postfix.charAt(i);
if(isOperator(c)&&!st.isEmpty()){
double d2=Double.valueOf(st.pop().toString());
double d1=Double.valueOf(st.pop().toString());
double d3=0;
if('+'==c){
d3=d1+d2;
}
if('-'==c){
d3=d1-d2;
}
if('/'==c){
d3=d1/d2;
}
if('*'==c){
d3=d1*d2;
}
if('%'==c){
d3=d1%d2;
}
if('^'==c){
d3=Math.pow(d1, d2);
}
st.push(d3);
}else{
st.push(c);}
}
return (double) st.pop();
}
public boolean isOperator(char c){
if('+'==c||'-'==c||'/'==c||'*'==c||'%'==c||'^'==c){
return true;
}
else {
return false;
}
}
public boolean isOpenParent(char c){
return c=='(';
}
public boolean isCloseParent(char c){
return c==')';
}
public int priority(char c){
if(c=='^'){
return 3;
}
if(c=='/'||c=='*'||c=='%'){
return 2;
}
else if(c=='-'||c=='+'){
return 1;
}
else return 0;
}
public static void main(String[] args) throws Exception {
Example3_3 p=new Example3_3();
String postfix =p.converToPostfix("3+2*8+(5+5)+2^2/2*5%3");
System.out.println("表达式结果为:"+p.numberCalculate(postfix));
}
}