学习日志-中缀表达式转后缀表达式并计算结果
生活随笔
收集整理的這篇文章主要介紹了
学习日志-中缀表达式转后缀表达式并计算结果
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
將中綴表達式轉換為后綴表達式:
(1)當讀到數字直接送至輸出隊列中;
(2)當讀到運算符t時:
? ? a.將棧中所有優先級高于或等于t的運算符彈出,送到輸出隊列中;
? 這句話不好理解,可以說成這樣,從棧頂開始,依次彈出比當前處理的運算符優先級高的運算符,直到一個比它優先級低的或者遇到了一個左括號就停止。
? ? b.t進棧;?
(3)讀到左括號時總是將它壓入棧中;?
(4)讀到右括號時,將靠近棧頂的第一個左括號上面的運算符全部依次彈出,送至輸出隊列后,再丟棄左括號;?
(5)中綴表達式全部讀完后,若棧中仍有運算符,將其送到輸出隊列中。
//?將中綴表達式轉換為后綴表達式public?static?String?infixToSuffix(String?exp)?{//?創建操作符堆棧Stack<Character>?s?=?new?Stack<Character>();String?suffix?=?"";?//?輸出的后綴表達式字符串。int?len?=?exp.length();for?(int?i?=?0;?i?<?len;?i++)?{char?temp;?//?臨時字符變量char?ch?=?exp.charAt(i);switch?(ch)?{//?忽略空格case?'?':break;//?如果是左括號,直接壓入堆棧。case?'(':s.push(ch);break;//?如果是加號或者減號,則彈出所有的字符送至輸出序列,直到碰到左括號為止//?然后把該運算符再壓進堆棧。case?'+':case?'-':while?(!s.isEmpty())?{temp?=?s.pop();if?(temp?==?'(')?{s.push(temp);break;}suffix?+=?temp;}s.push(ch);?//?把運算符壓進堆棧。break;//?如果是乘號或者除號,則彈出所有的字符送至輸出序列,直到碰到左括號或者加號或者減號為止//?然后把該運算符再壓進堆棧。case?'*':case?'/':while?(!s.isEmpty())?{temp?=?s.pop();if?(temp?==?'('?||?temp?==?'+'?||?temp?==?'-')?{s.push(temp);break;}?else?{suffix?+=?temp;}}s.push(ch);break;case?')':while?(!s.isEmpty())?{temp?=?s.pop();if?(temp?==?'(')?{break;}?else?{suffix?+=?temp;}}break;//?默認如果讀到是數字,則直接送至輸出序列default:suffix?+=?ch;break;}}//?如果棧不為空,把剩余的運算符依次彈出,送至輸出序列。while?(!s.isEmpty())?{suffix?+=?s.pop();}return?suffix;}//?輸入后綴表達式字符串得到運算結果public?static?double?suffixToArithmetic(String?exp)?{Pattern?pattern?=?Pattern.compile("\\d+||(\\d+\\.\\d+)");?//?使用正則表達式匹配數字//?用指定字符,把字符串轉換為字符串數組。String?strings[]?=?exp.split("");Stack<Double>?stack?=?new?Stack<Double>();for?(int?i?=?0;?i?<?strings.length;?i++)?{if?(strings[i].equals(""))continue;//?如果是數字,則進棧if?((pattern.matcher(strings[i])).matches())?{stack.push(Double.parseDouble(strings[i]));}?else?{//?如果是運算符,彈出運算數,計算結果。double?y?=?stack.pop();double?x?=?stack.pop();stack.push(caculate(x,?y,?strings[i]));?//?將運算結果重新壓入棧。}}return?stack.pop();}//計算 private?static?double?caculate(double?x,?double?y,?String?simble)?{if?(simble.trim().equals("+"))return?x?+?y;if?(simble.trim().equals("-"))return?x?-?y;if?(simble.trim().equals("*"))return?x?*?y;if?(simble.trim().equals("/"))return?x?/?y;return?0;} }轉載于:https://blog.51cto.com/wukong0716/1687398
總結
以上是生活随笔為你收集整理的学习日志-中缀表达式转后缀表达式并计算结果的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CString + UINT Error
- 下一篇: iOS:(接口适配器3)--iPhone