Java表示式求值
阿新 • • 發佈:2019-01-07
1、先讀取表示式,用字串存,比如字串“1+2+3”
2、將字串中的數字和運算子識別出來,按依次存在linkedlist裡面 ,就變成 了 1+2+3 (數字為integ型別,字串為#character型別),這就是中序表示式
3、將中序表示式 轉換成 後序表示式 存在另一個linkedlisi裡面
4、計算後序表示式的值
本程式主要是理清表示式求值的方法,本程式 還存在一些小問題:不能識別 小數,負數,感興趣的可以自行修改程式
public class biaodashiqiuzhi_01
{
List zhongxu=new LinkedList();//儲存中序表示式
List houxu=new LinkedList();//儲存後續表示式
/*
* 函式名:priority
* 判斷操作符優先順序
* 大於返回1 等於返回0 小於返回 -1
*/
public int priority(char a,char b)//判斷優先順序
{
if (a=='+' || a=='-')
switch (b)
{
case '+':
case '-':
return 0;
default:
return -1;
}
else
switch (b)
{
case '+':
case '-':
return 1;
case '*':
case '/':
return 0;
default :
return -1;
}
}
public void divide(String shizi)//識別字符串中的數字和字元
{
int flag=0; double a=0;double j=0;
for(int i=0;i<shizi.length();i++)
{
char c=shizi.charAt(i);
//如果是操作符
if (c=='+' || c=='-' || c=='*' || c=='/' || c=='(' || c==')' )
{
if (flag==1) //為了處理連續兩個操作符的情形,數字重複進入連結串列
zhongxu.add(a);
zhongxu.add(c);
flag=0;
a=0;
}
else //如果是數字
{
if(flag==0)//第一次讀到數字進行標記
flag=1;
a=a*10+c-48;
//數字進入連結串列依賴於身後的符號,但是數字後面沒有符號的時候,是一種特殊情況
if (i==shizi.length()-1)
zhongxu.add(a);
}
}
}
public void MidTOBack()//中序表示式轉換成後續表示式
{
Mystack temp=new Mystack();
for (Object object : zhongxu)
{
if (object instanceof Character)
{
if (object.equals('(')) //左括號 直接進入後續表示式
temp.push(object);
else
//右括號,則吧遇到左括號之前的操作符全部放到後續表示式中
if (object.equals(')') )
{
while(!temp.getTop().equals('('))
houxu.add(temp.pop());
temp.pop();
}
else
if (temp.isEmpty())
temp.push(object);
else
if ( priority((char)object , (char)temp.getTop() ) >0)
temp.push(object);
else
if (temp.getTop().equals('('))
temp.push(object);
else
{
while(!temp.isEmpty()
&& !temp.getTop().equals('(') &&
priority((char)object , (char)temp.getTop() ) <1)
houxu.add(temp.pop());
temp.push(object);
}
}
else//數字 直接進入後續表示式
{houxu.add(object);}
}
while(!temp.isEmpty())
houxu.add(temp.pop());
}
public void calulate()//計算後續表示式
{
for (int i = 0; houxu.size()!=1; i++)
{
if (houxu.get(i) instanceof Character)
{
if(houxu.get(i).equals('+'))
houxu.set(i-2, (Double)houxu.get(i-2)+(Double)houxu.get(i-1) );
if(houxu.get(i).equals('-'))
houxu.set(i-2, (Double)houxu.get(i-2)-(Double)houxu.get(i-1) );
if(houxu.get(i).equals('*'))
houxu.set(i-2, (Double)houxu.get(i-2)*(Double)houxu.get(i-1) );
if(houxu.get(i).equals('/'))
houxu.set(i-2, (Double)houxu.get(i-2)/(Double)houxu.get(i-1) );
houxu.remove(i-1);
houxu.remove(i-1);
i-=2;
}
}
System.out.println(houxu.get(0));
}
public static void main(String[] args)
{
biaodashiqiuzhi_01 test=new biaodashiqiuzhi_01();
Scanner scanner=new Scanner(System.in);
while(true)
{
String str=scanner.nextLine();
test.divide(str);
test.MidTOBack();
test.calulate();
}
}
}