Java實(shí)現(xiàn)中序表達(dá)式的實(shí)例代碼
什么是中序表達(dá)式
前序(前綴)表達(dá)式要求每一個操作符出現(xiàn)在其操作數(shù)之前.一般不用. 寫表達(dá)式的后序表達(dá)式一般是為了便利于計算機(jī)編程中棧的實(shí)現(xiàn),所以用的較多.
具體代碼如下所示:
package 表達(dá)式求值;
import java.util.Stack;
/*
* 中序表達(dá)式求值實(shí)現(xiàn)
*/
public class CenterExpression {
public double evaluate(String expression){ //傳入中序表達(dá)式
char [] ex = expression.toCharArray();
Stack<Double> num = new Stack<>();
Stack<Character> ops = new Stack<>();
for(int i = 0; i < ex.length; i++){ //循環(huán)將表達(dá)式依次入棧
char c = ex[i];
if(c < '9' && c > '0'){
num.push(Double.parseDouble(Character.toString(c)));
}
else if(c == '('){
ops.push('(');
}
else if(c == ')'){
while(true){
char op = ops.pop();
if(op == '('){
break;
}
else{
switch(op){
case '+':num.push(num.pop()+num.pop());break;
case '-':num.push(num.pop()-num.pop());break;
case '*':num.push(num.pop()*num.pop());break;
case '/':num.push(num.pop()/num.pop());break;
default:break;
}
}
}
}
else if(ops.empty() && (c == '+' || c == '-' || c == '*' || c == '/')){
ops.push(c);
}
else if(!ops.isEmpty() && (c == '+' || c == '-' || c == '*' || c == '/')){
char op =ops.peek();
while((op == '*' || op == '/') && (c == '+' || c == '-')){
op = ops.pop();
switch(op){
case '+':num.push(num.pop()+num.pop());break;
case '-':num.push(num.pop()-num.pop());break;
case '*':num.push(num.pop()*num.pop());break;
case '/':num.push(num.pop()/num.pop());break;
default:break;
}
if(ops.isEmpty()){
break;
}
else{
op = ops.peek();
}
}
ops.push(c);
}
}
while(!ops.isEmpty()){ //處理剩余可以按計算機(jī)掃描順序處理的表達(dá)式
char op =ops.pop();
switch(op){
case '+':num.push(num.pop()+num.pop());break;
case '-':num.push(num.pop()-num.pop());break;
case '*':num.push(num.pop()*num.pop());break;
case '/':num.push(num.pop()/num.pop());break;
default:break;
}
}
return num.pop();
}
public static void main(String [] args){
CenterExpression exp = new CenterExpression();
System.out.println(exp.evaluate("1*2+5*3"));
}
}
總結(jié)
以上所述是小編給大家介紹的Java實(shí)現(xiàn)中序表達(dá)式的實(shí)例代碼,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
SpringBoot?整合MyBatis+MyBatis-Plus+MyBatisX插件使用
本文主要介紹了SpringBoot?整合MyBatis+MyBatis-Plus+MyBatisX插件使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-04-04
jdk-logging?log4j?logback日志系統(tǒng)實(shí)現(xiàn)機(jī)制原理介紹
這篇文章主要介紹了jdk-logging、log4j、logback日志介紹以及三個日志系統(tǒng)的實(shí)現(xiàn)機(jī)制,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-03-03
Java源碼解析HashMap的tableSizeFor函數(shù)
今天小編就為大家分享一篇關(guān)于Java源碼解析HashMap的tableSizeFor函數(shù),小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-01-01
Springboot @Configuration與自動配置詳解
這篇文章主要介紹了SpringBoot中的@Configuration自動配置,在進(jìn)行項目編寫前,我們還需要知道一個東西,就是SpringBoot對我們的SpringMVC還做了哪些配置,包括如何擴(kuò)展,如何定制,只有把這些都搞清楚了,我們在之后使用才會更加得心應(yīng)手2022-07-07
用java實(shí)現(xiàn)的獲取優(yōu)酷等視頻縮略圖的實(shí)現(xiàn)代碼
想獲取優(yōu)酷等視頻縮略圖,在網(wǎng)上沒有找到滿意的資料,參考了huangdijia的PHP版工具一些思路,寫了下面的JAVA版代碼。。其實(shí)也可以做成JS版的2013-05-05

