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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

前缀表达式计算、中缀表达式计算、后缀表达式计算

發布時間:2024/1/1 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 前缀表达式计算、中缀表达式计算、后缀表达式计算 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

首先要知道什么是前綴表達式,什么是中綴表達式,什么是后綴表達式

所謂的中綴表達式就是類似于這種的運算?1+((2+3)×4)-5

所謂的前綴表達式就是符號在兩個操作數的前面?- + 1 × + 2 3 4 5

所謂的后綴表達式就是兩個數在運算符的右邊?3 4 + 5 × 6 -

這樣我們就知道了前中后綴表達式所代表的含義是什么,在我們人的腦子看來,這個是一個很簡單的運算操作,但是你要把他放在電腦上面,中綴表達式我感覺是比較難的,因為你要考慮運算符的優先級,括號的情況等等,我們可以將其轉換成為前綴表達式或者后綴表達式來進行操作,其實原理都是一樣的。

我們這里用前綴表達式做例子:

我們使用一個棧來運算,我們的優先順序是從右往左遍歷

  • 當遇到數字的時候,壓棧
  • 當遇到運算符的時候,棧頂的兩個元素出棧,計算之后再入棧
  • 就像我們的

    -×+3456
  • 遇到6,壓棧
  • 遇到5,壓棧
  • 遇到4,壓棧
  • 遇到3,壓棧
  • 遇到+,取出棧頂的3和4,計算之后,壓棧
  • 遇到*,取出棧頂的7和5,計算之后,壓棧
  • 遇到-,取出棧頂的35和6,計算之后,壓棧
  • 最后存在棧里面的就是最終的結果
  • package com.zhongruan.testDemo;import java.util.*;/*** @author weirdo* @date 2020-10-30 11:24* @email 1435380700@qq.com*/ public class Main {public static void main(String[] args) {Main m = new Main();String str = "-×+3456";System.out.println(m.preCalculate(str));}/*** 通過前綴表達式求值* 從右到左掃描,掃到數字進棧,掃到操作運算符就取出兩個,進行計算然后壓棧* @param str* @return*/public int preCalculate(String str){//bianliStack<Integer> number = new Stack<>();for(int i=str.length()-1;i>=0;i--){if(str.charAt(i)>='0' && str.charAt(i)<='9'){number.push(str.charAt(i)-'0');}else{switch (str.charAt(i)){case '+':{int num1 = number.pop();int num2 = number.pop();number.push(num1+num2);break;}case '-':{int num1 = number.pop();int num2 = number.pop();number.push(num1-num2);break;}case '×':{int num1 = number.pop();int num2 = number.pop();number.push(num1*num2);break;}case '/':{int num1 = number.pop();int num2 = number.pop();number.push(num1/num2);break;}default:break;}}}//最后應該只剩下一個數字return number.pop();}}

    那么我們的中綴表達式這么變成前綴表達式/后綴表達式呢?其實都是一樣的,一個正序,一個倒序。。

    我們使用兩個棧,stack1 和 stack2 來存儲

  • 將前綴表達式從后往前遍歷,如果當前的是數字的話,壓入stack1
  • 如果是操作運算符的話,且stack2為空的話,直接壓棧
  • 否則則要比較運算符的優先級(第一優先級()、第二優先級* /、第三優先級 + -)
  • 如果當前的優先級比棧頂的運算符優先級高的話,則棧頂的運算符出棧stack1.push(stack2.pop());
  • 最后將stack2種的數字壓入stack1,得到的就是后綴表達式,反轉一下就是前綴表達式
  • ?

    package com.zhongruan.testDemo;import java.util.*;/*** @author weirdo* @date 2020-10-30 11:24* @email 1435380700@qq.com*/ public class Main {public static void main(String[] args) {Main m = new Main(); // String str = "-×+3456"; // System.out.println(m.preCalculate(str));System.out.println(m.toPreExpression("1+((2+3)*4)-5"));System.out.println("- + 1 × + 2 3 4 5");}/*** 通過前綴表達式求值* 從右到左掃描,掃到數字進棧,掃到操作運算符就取出兩個,進行計算然后壓棧* @param str* @return*/public int preCalculate(String str){//bianliStack<Integer> number = new Stack<>();for(int i=str.length()-1;i>=0;i--){if(str.charAt(i)>='0' && str.charAt(i)<='9'){number.push(str.charAt(i)-'0');}else{switch (str.charAt(i)){case '+':{int num1 = number.pop();int num2 = number.pop();number.push(num1+num2);break;}case '-':{int num1 = number.pop();int num2 = number.pop();number.push(num1-num2);break;}case '×':{int num1 = number.pop();int num2 = number.pop();number.push(num1*num2);break;}case '/':{int num1 = number.pop();int num2 = number.pop();number.push(num1/num2);break;}default:break;}}}//最后應該只剩下一個數字return number.pop();}/*** 中綴表達式轉化成為前綴表達式* @return*/public String toPreExpression(String str){Map<Character,Integer> map = new HashMap<>();map.put('+',0);map.put('-',0);map.put('*',1);map.put('/',1);map.put(')',2);Stack<Character> stack1 = new Stack<>();Stack<Character> stack2 = new Stack<>();for(int i=str.length()-1;i>=0;i--){char c = str.charAt(i);if(c >='0' && c <='9'){//如果是數字stack1.push(c);}else{if(stack2.isEmpty()){stack2.push(c);}else{if(c==')'){stack2.push(c);}else if(c=='('){while (stack2.peek()!=')' && !stack2.isEmpty()){stack1.push(stack2.pop());}stack2.pop();}else{//比較運算符優先級while (!stack2.isEmpty() && map.get(stack2.peek())<map.get(c)){stack1.push(stack2.pop());}stack2.push(c);}}}}while (!stack2.isEmpty()){stack1.push(stack2.pop());}return stack1.toString();}}

    ?

    總結

    以上是生活随笔為你收集整理的前缀表达式计算、中缀表达式计算、后缀表达式计算的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。