前缀表达式计算、中缀表达式计算、后缀表达式计算
生活随笔
收集整理的這篇文章主要介紹了
前缀表达式计算、中缀表达式计算、后缀表达式计算
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
首先要知道什么是前綴表達式,什么是中綴表達式,什么是后綴表達式
所謂的中綴表達式就是類似于這種的運算?1+((2+3)×4)-5
所謂的前綴表達式就是符號在兩個操作數的前面?- + 1 × + 2 3 4 5
所謂的后綴表達式就是兩個數在運算符的右邊?3 4 + 5 × 6 -
這樣我們就知道了前中后綴表達式所代表的含義是什么,在我們人的腦子看來,這個是一個很簡單的運算操作,但是你要把他放在電腦上面,中綴表達式我感覺是比較難的,因為你要考慮運算符的優先級,括號的情況等等,我們可以將其轉換成為前綴表達式或者后綴表達式來進行操作,其實原理都是一樣的。
我們這里用前綴表達式做例子:
我們使用一個棧來運算,我們的優先順序是從右往左遍歷
就像我們的
-×+3456那么我們的中綴表達式這么變成前綴表達式/后綴表達式呢?其實都是一樣的,一個正序,一個倒序。。
我們使用兩個棧,stack1 和 stack2 來存儲
?
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();}}?
總結
以上是生活随笔為你收集整理的前缀表达式计算、中缀表达式计算、后缀表达式计算的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 通达信的接口是用易语言编程吗?
- 下一篇: 3D数据转换一站式解决方案CAD Exc