package com.djb.calculatdemo;
import java.util.ArrayList;
import java.util.Stack;
导入javax.management.runtime error exception;
公共类计算{
publicstaticvoidmain (字符串[ ] args ) {
arraylistsuffixfxpression=getsuffixfxpression (' 10.5 ) () (2) *4)-5/2 );
双计算=计算(suffixfxpression;
系统. out.println (calculate;
}
//*
*将骑马订字符串转换为后缀数组
* @param str传递的骑马订字符串
* @return后缀表达式数组
*/
隐私保护角色列表suffixfxpression {
//保存运算符号的堆栈
堆栈信号堆栈=new stack (;
//保存后缀表达式数组
ArrayList numList=new ArrayList (;
//保存当前遍历的数字
stringbuffercurnum=new string buffer (;
for(intI=0; i str.length (; I ) {
//当前正在遍历的字符
charch=str.charat(I;
if(ch=48ch=57||ch=='.' ) /遍历数字
curnum.append(ch;
//取得完整的数字
int j=i 1;
while (真)。
if(j==str.Length () ) ) ) ) )。
布雷克;
}
if(str.charat(j )=48 str.charAt(j ) j )|str.charat '.' ) {
Curnum.append(str.Charat(j ) );
}else {
布雷克;
}
j;
}
//将获取的完整数字放入数组中
numlist.add(Curnum.tostring ) );
//清空当前连接的数字
curnum.delete(0,curNum.length ) );
i=j - 1;
}elseif(ch==' () ) /遍历左括号直接进入符号堆栈
sign stack.push (string.value of (ch ) );
}elseif(ch==' ) ) /遍历右括号,将符号堆栈中的符号依次添加到数组中,在知道遇到右括号后再堆栈右括号
while (! signStack.peek ().equals () ) ) ) ) ) )。
numlist.add(signstack.pop ) );
}
signStack.pop (;
}遍历}else {//运算符号时,如果当前运算符号的优先级低于符号堆栈的顶部优先级,则将符号堆栈的顶部堆栈添加到数字中会显示当前符号高于堆栈的顶部优先级
while (sign stack.size (0getsymbolgread (sign stack.peek ) )=getsymbolgread (string.value of (ch ) ) ) )
numlist.add(signstack.pop ) );
}
//最后将当前符号放入堆栈中
sign stack.push (string.value of (ch ) );
}
}
//按顺序堆栈符号堆栈中的数据并将其添加到数字数组中
while(signstack.size )0) )。
numlist.add(signstack.pop ) );
}
返回编号;
}
//*
*使用后缀表达式计算结果
* @param array后缀表达式数组
*/
隐私保护计划
堆叠numstack=new stack (;
//按正向遍历后缀表达式数组
字符串项3360阵列(for ) )。
if(issymbol(item ) ) /遍历到运算符,依次从堆栈中取出两个个数,然后反向运算两个个数,将运算结果放入堆栈中
双结果=0;
双精度编号1=双精度. parse双精度(numstack.pop );
双精度编号2=双精度. parse双精度(numstack.pop );
if(item.equals (' ' ) ) }
result=num2 num1;
}elseif(item.equals('-' ) )。
result=num2 - num1;
}elseif(item.equals('* ' ) )。
result=num2 * num1;
}elseif(item.equals ) (/) () ) )。
result=num2/num1;
}else {
thrownewruntimeerrorexception;
}
numstack.push(string.valueof ) result );
}遍历到}else {//数字,直接进入堆栈
Numstack.push(item;
}
}
//最后堆栈是计算的结果
return double.parse double (numstack.pop );
}
//*
*获取运算符号的优先顺序
* @param symbol传递的运算符号
*/
私有状态触发系统布尔gread {
int gread=0;
交换机(symbol ) {
case ' ':
case '-':
导线=1;
布雷克;
case '*':
case '/':
导线=2;
默认:
布雷克;
}
返回网格;
}
//*
*确定传入的字符串是否为运算符号
* @param str传递的字符串
*/
私密性统计信息
return str.equals|| str.equals|| str.equals|| str.equals|'/' )
}
}