日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

中缀表达式转换成后缀表达式

發(fā)布時(shí)間:2025/4/16 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 中缀表达式转换成后缀表达式 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

中綴表達(dá)式就是我們正常工作中寫(xiě)的表達(dá)式,如 a+(b-c)*d ,編譯系統(tǒng)將中綴表達(dá)式改寫(xiě) abc-d*+,這種運(yùn)算符在操作數(shù)后面稱為后綴表達(dá)式(也稱逆波蘭表達(dá)式)。

如何實(shí)現(xiàn)轉(zhuǎn)換的呢?這里做一下自己的理解及記錄。

利用棧來(lái)實(shí)現(xiàn)

轉(zhuǎn)換過(guò)程需要用到棧,這里用兩個(gè)棧,stack 棧用來(lái)存放運(yùn)算符,post 棧用來(lái)存放最后的后綴表達(dá)式。具體規(guī)則如下:

從左到右掃描中綴表達(dá)式,若是操作數(shù),直接存入 post 棧;

若是運(yùn)算符:
(1)該運(yùn)算符是左括號(hào) ( , 則直接存入 stack 棧。
(2)該運(yùn)算符是右括號(hào) ),則將 stack 棧中 ( 前的所有運(yùn)算符出棧,存入 post 棧。
(3)若該運(yùn)算符為非括號(hào),則將該運(yùn)算符和 stack 棧頂運(yùn)算符作比較:若高于棧頂運(yùn)算符,則直接存入 stack 棧,否則將棧頂運(yùn)算符出棧(從棧中彈出元素直到遇到發(fā)現(xiàn)更低優(yōu)先級(jí)的元素(或者棧為空)為止),存入 post 棧。
(4)當(dāng)掃描完后,stack 棧中還有運(yùn)算符時(shí),則將所有運(yùn)算符出棧,存入 post 棧。

例子:中綴表達(dá)式 a + b * c + (d * e + f) * g,其轉(zhuǎn)換成后綴表達(dá)式則為a b c * + d e * f + g * +。

掃描stack 棧post 棧
aa
a++a
a+b+ab
a+b*+*ab
a+b*c+*abc
a+b*c++abc*+
a+b*c+(+(abc*+
a+b*c+(d+(abc*+d
a+b*c+(d*+(*abc*+d
a+b*c+(d*e+(*abc*+de
a+b*c+(d*e++(+abc*+de*
a+b*c+(d*e+f+(+abc*+de*f
a+b*c+(d*e+f)+abc*+de*f+
a+b*c+(d*e+f)*+*abc*+de*f+
a+b*c+(d*e+f)*g+*abc*+de*f+g
a+b*c+(d*e+f)*g#abc*+de*f+g*+

注意:表格中第6步,讀到+,因?yàn)闂m斣?的優(yōu)先級(jí)高,所以*出棧,棧中下一個(gè)元素+優(yōu)先級(jí)與讀到的操作符+一樣,所以也要彈出。然后再將讀到的+壓入棧中。
第13步,讀到),則直接將棧中元素彈出直到遇到(為止。這里左括號(hào)前只有一個(gè)操作符+被彈出。

代碼實(shí)現(xiàn)

import java.util.Stack;public class InToPost {private Stack<Character> opStack;private Stack<Character> outStack;private String input;public InToPost(String in) {input = in;opStack = new Stack<Character>();outStack = new Stack<Character>();}public Stack<Character> doTrans() { //其他類型自行轉(zhuǎn)換for (int i = 0; i < input.length(); i++) {char ch = input.charAt(i);switch (ch) {case '+':case '-':operationOpStack(ch, 1);break;case '*':case '/':operationOpStack(ch, 2);break;case '(':opStack.push(ch);break;case ')':operationParen();break;default:outStack.push(ch);break;}}while (!opStack.isEmpty()) {outStack.push(opStack.pop());}return outStack;}public void operationOpStack(char opThis, int prec1) {//運(yùn)算符棧操作while (!opStack.isEmpty()) {char opTop = opStack.pop();if (opTop == '(') {opStack.push(opTop);}else {int prec2;if (opTop == '+' || opTop == '-')prec2 = 1;elseprec2 = 2;if (prec2 < prec1) {opStack.push(opTop);break;}elseoutStack.push(opTop);}}opStack.push(opThis);}public void operationParen() {while (!opStack.isEmpty()) {char c = opStack.pop();if (c == '(') break;elseoutStack.push(c);}}public static void main(String[] args) {String input = "1+2*4/5-7+3/6";InToPost theTrans = new InToPost(input);Stack<Character> output = theTrans.doTrans(); System.out.println("Postfix is " + output + '\n');} }

利用語(yǔ)法樹(shù)

先將中綴表達(dá)式用二叉樹(shù)表示出來(lái),再后序遍歷該二叉樹(shù),就得到其相應(yīng)的后綴表達(dá)式。

加括號(hào)法

加括號(hào)法先將中綴表達(dá)式每步要計(jì)算的表達(dá)式加上括號(hào),然后將每個(gè)運(yùn)算符移到其所在括號(hào)的外面,最后,從左到右去掉括號(hào)后就是后綴表達(dá)式。

例子: a+(b-c)*d

加括號(hào) (a+((b-c)*d))移運(yùn)算符 (a((bc)-d)*)+
去括號(hào) abc-d*+

后綴表達(dá)式求值

求值過(guò)程可用棧來(lái)輔助存儲(chǔ)。假定待求值的后綴表達(dá)式為:6 5 2 3 + 8 * + 3 + *,則其求值過(guò)程如下:

  • 遍歷表達(dá)式,遇到數(shù)字首先放入棧,此時(shí)棧如下 6 5 2 3
  • 接著讀到+,則彈出3和2,執(zhí)行3+2,將結(jié)果5壓棧 6 5 5
  • 讀到8,壓棧 6 5 5 8
  • 讀到 *, 彈出8和5,執(zhí)行8*5,將結(jié)果40壓棧 6 5 40
  • 讀到 +,彈出40和5,執(zhí)行40+5,將結(jié)果45壓棧 6 45
  • 讀到 3,壓棧 6 45 3
  • 讀到 +,彈出3和45,執(zhí)行3+45,將結(jié)果48壓棧 6 48
  • 讀到 *,彈出48和6,執(zhí)行48*6,將結(jié)果288壓棧 288
  • 最后結(jié)果288

總結(jié)

以上是生活随笔為你收集整理的中缀表达式转换成后缀表达式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。