亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

java實現任意四則運算表達式求值算法

2020-01-26 15:07:18
字體:
來源:轉載
供稿:網友

本文實例講述了java實現任意四則運算表達式求值算法。分享給大家供大家參考。具體分析如下:

該程序用于計算任意四則運算表達式。如 4 * ( 10 + 2 ) + 1 的結果應該為 49。
算法說明:

1. 首先定義運算符優先級。我們用一個

Map<String, Map<String, String>>

來保存優先級表。這樣我們就可以通過下面的方式來計算兩個運算符的優先級了:

/** * 查表得到op1和op2的優先級 * @param op1 運算符1 * @param op2 運算符2 * @return ">", "<" 或 "=" */public String priority(String op1, String op2) { return priorityMap.get(op1).get(op2);}

2. 掃描表達式字符串,每次讀入一個 token 進行處理。

使用兩個輔助棧:optStack用于保存運算符,numStack用于保存操作數. 我們用 '#' 作為表達式的起始和結果標志符。

讀入一個token,如果它是數字,則壓入numStack棧中;

如果它是運算符,則取出optStack棧的棧頂元素A,將 A 與 token 進行優先級比較。

如果 A < token,則將 token 壓入optStack棧。

如果 A = token,則說明 token和A是一對括號,此時將optStack棧的棧頂元素彈出。

如果 A > token,則從numStack中彈出2個操作數,從optStack中彈出1個運算符,并計算結果。

當optStrack棧為空時(即棧頂元素為 '#'),numStack棧的棧頂元素即為表達式的值。

算法實現:

/** * 算術表達式求值。 * 3 + 4 * 12 結果為51 * @author whf * */public class EvaluateExpression { // 運算符優先級關系表 private Map<String, Map<String, String>> priorityMap = new HashMap<String, Map<String, String>>(); private LinkedStack<String> optStack = new LinkedStack<String>(); // 運算符棧 private LinkedStack<Double> numStack = new LinkedStack<Double>(); // 操作數棧 /**  * 計算表達式  * @param exp 四則運算表達式, 每個符號必須以空格分隔  * @return  */ public double calcualte(String exp) {  StringTokenizer st = new StringTokenizer(exp);  while (st.hasMoreTokens()) {   String token = st.nextToken();   process(token);  }  return numStack.pop(); } /**  * 讀入一個符號串。  * 如果是數字,則壓入numStack  * 如果是運算符,則將optStack棧頂元素與該運算符進行優先級比較  * 如果棧頂元素優先級低,則將運算符壓入optStack棧,如果相同,則彈出左括號,如果高,則取出2個數字,取出一個運算符執行計算,然后將結果壓入numStack棧中  * @param token  */ private void process(String token) {  while (false == "#".equals(optStack.getTop()) || false == token.equals("#")) {   // token is numeric   if (true == isNumber(token)) {        numStack.push(Double.parseDouble(token));        break;        // token is operator   } else {        String priority = priority(optStack.getTop(), token);        if ("<".equals(priority)) {         optStack.push(token);         break;        } else if ("=".equals(priority)) {         optStack.pop();         break;        } else {          double res = calculate(optStack.pop(), numStack.pop(), numStack.pop());          numStack.push(res);        }   }  } } /**  * 執行四則運算  * @param opt  * @param n1  * @param n2  * @return  */ private double calculate(String opt, double n1, double n2) {  if ("+".equals(opt)) {   return n2 + n1;  } else if ("-".equals(opt)) {   return n2 - n1;  } else if ("*".equals(opt)) {   return n2 * n1;  } else if ("/".equals(opt)) {   return n2 / n1;  } else {   throw new RuntimeException("unsupported operator:" + opt);  } } /**  * 檢查一個String是否為數字  * @param token  * @return  */ private boolean isNumber(String token) {  int LEN = token.length();  for (int ix = 0 ; ix < LEN ; ++ix) {   char ch = token.charAt(ix);   // 跳過小數點   if (ch == '.') {    continue;   }   if (false == isNumber(ch)) {    return false;   }  }  return true; } /**  * 檢查一個字符是否為數字  * @param ch  * @return  */ private boolean isNumber(char ch) {  if (ch >= '0' && ch <= '9') {   return true;  }  return false; } /**  * 查表得到op1和op2的優先級  * @param op1 運算符1  * @param op2 運算符2  * @return ">", "<" 或 "="  */ public String priority(String op1, String op2) {  return priorityMap.get(op1).get(op2); } /**  * 構造方法,初始化優先級表  */ public EvaluateExpression() {  // initialize stack  optStack.push("#");  // initialize priority table  // +  Map<String, String> subMap = new HashMap<String, String>();  subMap.put("+", ">");  subMap.put("-", ">");  subMap.put("*", "<");  subMap.put("/", "<");  subMap.put("(", "<");  subMap.put(")", ">");  subMap.put("#", ">");  priorityMap.put("+", subMap);  // -  subMap = new HashMap<String, String>();  subMap.put("+", ">");  subMap.put("-", ">");  subMap.put("*", "<");  subMap.put("/", "<");  subMap.put("(", "<");  subMap.put(")", ">");  subMap.put("#", ">");  priorityMap.put("-", subMap);  // *  subMap = new HashMap<String, String>();  subMap.put("+", ">");  subMap.put("-", ">");  subMap.put("*", ">");  subMap.put("/", ">");  subMap.put("(", "<");  subMap.put(")", ">");  subMap.put("#", ">");  priorityMap.put("*", subMap);  // /  subMap = new HashMap<String, String>();  subMap.put("+", ">");  subMap.put("-", ">");  subMap.put("*", ">");  subMap.put("/", ">");  subMap.put("(", "<");  subMap.put(")", ">");  subMap.put("#", ">");  priorityMap.put("/", subMap);  // (  subMap = new HashMap<String, String>();  subMap.put("+", "<");  subMap.put("-", "<");  subMap.put("*", "<");  subMap.put("/", "<");  subMap.put("(", "<");  subMap.put(")", "=");  //subMap.put("#", ">");  priorityMap.put("(", subMap);  // )  subMap = new HashMap<String, String>();  subMap.put("+", ">");  subMap.put("-", ">");  subMap.put("*", ">");  subMap.put("/", ">");  //subMap.put("(", "<");  subMap.put(")", ">");  subMap.put("#", ">");  priorityMap.put(")", subMap);  // #  subMap = new HashMap<String, String>();  subMap.put("+", "<");  subMap.put("-", "<");  subMap.put("*", "<");  subMap.put("/", "<");  subMap.put("(", "<");  //subMap.put(")", ">");  subMap.put("#", "=");  priorityMap.put("#", subMap); }}

程序測試:

String exp = "4 * ( 10 + 2 ) + 1 #";EvaluateExpression ee = new EvaluateExpression();out.println(ee.calcualte(exp));

運行結果為 49。

希望本文所述對大家的C++程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
午夜精品一区二区三区在线视频| 亚洲欧美一区二区三区四区| 亚洲成在人线av| 亚洲国产精品女人久久久| 亚洲美女激情视频| 久久福利视频导航| 国产精品精品视频一区二区三区| 97视频免费在线看| 欧美在线观看视频| 国产精品久久久av久久久| 亚洲午夜女主播在线直播| 久久在精品线影院精品国产| 中文综合在线观看| 揄拍成人国产精品视频| 精品久久久视频| 日本久久中文字幕| 91久久在线播放| 亚洲激情在线观看视频免费| 国产精品九九久久久久久久| 成人网在线免费观看| 国产剧情久久久久久| 欧美日韩国产丝袜美女| 欧美xxxx18性欧美| 日韩专区在线播放| 日本最新高清不卡中文字幕| 国产日产欧美a一级在线| 中文字幕v亚洲ⅴv天堂| 欧美激情奇米色| 国产精品久久久亚洲| 亚洲高清色综合| 成人黄色生活片| 日韩电影中文字幕av| 久久精品国产一区二区电影| 欧美丰满少妇xxxx| 久久免费精品日本久久中文字幕| 亚洲国产成人精品久久久国产成人一区| 亚洲色图色老头| 久热精品视频在线观看一区| 俺去了亚洲欧美日韩| 日韩av在线导航| 668精品在线视频| 久久影视电视剧免费网站清宫辞电视| 91精品国产91久久久久久| 91精品国产91久久久久久吃药| 日韩国产激情在线| 亚洲国产天堂久久综合| 欧美中文字幕在线播放| 欧美激情亚洲另类| 欧美中文字幕在线视频| 97高清免费视频| 欧美—级a级欧美特级ar全黄| 粉嫩老牛aⅴ一区二区三区| 国产亚洲欧美另类中文| 欧美激情精品久久久久久变态| 疯狂欧美牲乱大交777| 亚洲欧美日韩精品久久奇米色影视| 日韩精品999| 欧美性生交xxxxx久久久| 最近2019中文字幕大全第二页| 欧美第一黄色网| 亚洲黄色有码视频| 日韩av影院在线观看| 91sao在线观看国产| 国内精品400部情侣激情| 成人动漫网站在线观看| 色yeye香蕉凹凸一区二区av| 国产成人精品一区| 欧美又大又硬又粗bbbbb| 精品久久久久久电影| 怡红院精品视频| 大伊人狠狠躁夜夜躁av一区| 欧美一级淫片丝袜脚交| 国产亚洲精品高潮| 久久综合伊人77777蜜臀| 激情懂色av一区av二区av| 国产精品第100页| 欧美国产在线电影| 国内精品久久久久久中文字幕| 韩国v欧美v日本v亚洲| 亚洲自拍欧美另类| 亚洲激情中文字幕| 热门国产精品亚洲第一区在线| 国产视频精品在线| xxxx欧美18另类的高清| 北条麻妃一区二区三区中文字幕| 亚洲成人a级网| 欧美裸体xxxx极品少妇软件| 色综合色综合久久综合频道88| 国产激情久久久| 亚洲a在线播放| 777午夜精品福利在线观看| 成人午夜激情免费视频| 亚洲最大的免费| 91精品免费视频| 性色av香蕉一区二区| 国产精品久久电影观看| 中文字幕亚洲专区| 国产精品第一视频| 国产精国产精品| 黄网站色欧美视频| 一本色道久久综合亚洲精品小说| 欧美xxxx综合视频| 国内精品模特av私拍在线观看| 国产精品热视频| 久久久人成影片一区二区三区观看| 成人性教育视频在线观看| 日韩av电影在线免费播放| 日韩av在线一区二区| 日韩经典一区二区三区| 久久精品夜夜夜夜夜久久| 午夜精品蜜臀一区二区三区免费| 98精品国产高清在线xxxx天堂| 日韩精品免费视频| 色综合久久精品亚洲国产| 欧美特黄级在线| 爱福利视频一区| 91免费高清视频| 日本19禁啪啪免费观看www| 欧美第一淫aaasss性| 国产精品aaaa| 欧日韩不卡在线视频| 91精品久久久久久久久久久| 亚洲欧美日韩一区二区三区在线| 国产一区二区成人| 欧美三级xxx| 日韩在线视频观看正片免费网站| 亚洲精品一区中文| 久久99国产精品久久久久久久久| 国模吧一区二区三区| 51ⅴ精品国产91久久久久久| 国产区亚洲区欧美区| 久久精品久久久久电影| 国产欧美一区二区三区久久| 国产精品日韩在线播放| 中文字幕一区二区三区电影| 欧美成人合集magnet| 97avcom| 亚洲欧洲免费视频| 欧美性极品少妇精品网站| 欧美精品在线免费播放| 国产成人av在线播放| 少妇av一区二区三区| 日本高清久久天堂| 欧美成人免费全部观看天天性色| 国产美女精品视频免费观看| 日韩高清av在线| 日韩欧美一区二区三区| 中文字幕精品久久久久| 久久久久久久久久av| 97视频在线观看网址| 麻豆一区二区在线观看| 午夜免费久久久久| 精品国产一区二区三区久久狼5月| 欧美激情精品久久久久久免费印度| 欧美精品18videos性欧| 欧亚精品中文字幕| 久久久久久国产| 国产啪精品视频| 国产日韩欧美电影在线观看| 日韩美女在线观看一区| 国产欧美精品久久久| 亚洲国产私拍精品国模在线观看| 精品在线观看国产| 久久精品99久久久久久久久|