public class 栈运用_中值表达式{
/*--------当前运算符--------------*/
final static char pri[][] = // + - * / ^ ! ( ) \0*/
{
{'>','>','<','<','<','<','<','>','>'},
/* + */ {'>','>','<','<','<','<','<','>','>'},
/* 栈 - */ {'>','>','>','>','<','<','<','>','>'},
/* 顶 * */ {'>','>','>','>','<','<','<','>','>'},
/* 运 / */ {'>','>','>','>','>','<','<','>','>'},
/* 算 ^ */ {'>','>','>','>','>','>',' ','>','>'},
/* 符 ! */ {'<','<','<','<','<','<','<','=',' '},
/* ( */ {' ',' ',' ',' ',' ',' ',' ',' ',' '},
/* ) */ {'<','<','<','<','<','<','<',' ','='}
};
/* \0 */
static char orderBetween ( char op1, char op2 ) //比较两个运算符之间的优先级
{ return pri[optr2rank (op1)][optr2rank (op2)]; }
private static float calcu(float pOpnd1, char op, float pOpnd2) {
switch(op){
case '+':return pOpnd1 + pOpnd2;
case '-':return pOpnd1 - pOpnd2;
case '*':return pOpnd1 * pOpnd2;
case '/':return pOpnd1 / pOpnd2;
case '^':return (float) Math.pow(pOpnd1, pOpnd2);
}
return 0;
}
private static float fac(float pOpnd) {
if(pOpnd == 0)
return 1;
else
return fac(pOpnd-1)*pOpnd;
}
private static float calcu(char op, float pOpnd) {
return fac(pOpnd);
}
static int optr2rank ( char op ) { //由运算符转译出编号
switch ( op ) {
case '+' : return 0; //加
case '-' : return 1; //减
case '*' : return 2; //乘
case '/' : return 3; //除
case '^' : return 4; //乘方
case '!' : return 5; //阶乘
case '(' : return 6; //左括号
case ')' : return 7; //右括号
case 'm': return 8; //起始符与终止符
default : System.exit ( 0 ); //未知运算符
}
return -1;
}
static String readNumber(char ch[],int i){
String s = "";
while(Character.isDigit(ch[i])){
s = s + ch[i];
i++;
}
return s;
}
static float theMain(char ch[]){
Stack<Character> StackOperator = new Stack<Character>();
Stack<Float> StackOperand = new Stack<Float>();
StackOperator.push('m');
int i = 0;
while(!StackOperator.isEmpty()){
if(Character.isDigit(ch[i])){
String s = readNumber(ch,i);
StackOperand.push((float) (Float.valueOf(s)));
i = i + s.length();
}else{// 现在 栈顶
switch(orderBetween(StackOperator.peek(),ch[i])){
case '<':StackOperator.push(ch[i]);i++;break;
case '=':StackOperator.pop();i++;break;
case '>':{
char op = StackOperator.pop();
if('!' == op){
StackOperator.push(ch[i]);
float pOpnd = StackOperand.pop();
StackOperand.push(calcu(op,pOpnd));
}else{
float pOpnd2 = StackOperand.pop(),pOpnd1 = StackOperand.pop();
StackOperand.push(calcu(pOpnd1,op,pOpnd2));
}
break;
}
default: System.exit(0);;
}
}
}
return StackOperand.pop();
}
public static void main(String args[]){
String s = "2*(12+30)/8"+'m';
char ch[] = s.toCharArray();
System.out.println(theMain(ch));
}
}
栈运用之计算器
猜你喜欢
转载自blog.csdn.net/weixin_41926640/article/details/85236786
今日推荐
周排行