算法基础四:计算表达式

算法基础四:计算表达式中缀转后缀 引用地址 http www nowamagic net librarys veda detail 2307 我们把平时所用的标准四则运算表达式 即 9 3 1 3 10 2 叫做中缀表达式

大家好,欢迎来到IT知识分享网。

 

中缀转后缀:引用地址:http://www.nowamagic.net/librarys/veda/detail/2307

我们把平时所用的标准四则运算表达式,即“9+(3-1)*3+10/2″叫做中缀表达式。因为所有的运算符号都在两数字的中间,现在我们的问题就是中缀到后缀的转化。

中缀表达式“9+(3-1)*3+10/2”转化为后缀表达式“9 3 1-3*+ 10 2/+”

  •  
    规则:从左到右遍历中缀表达式的每个数字和符号,若是数字就输出,即成为后缀表达式的一部分;若是符号,则判断其与栈顶符号的优先级,是右括号或优先级低于找顶符号(乘除优先加减)则栈顶元素依次出找并输出,并将当前符号进栈,一直到最终输出后缀表达式为止。

下面我们来具体看看这个过程。

1. 初始化一空栈,用来对符号进出栈使用。

2. 第一个字符是数字9,输出9,后面是符号“+”,进栈。

算法基础四:计算表达式

3. 第三个字符是“(”,依然是符号,因其只是左括号,还未配对,故进栈。

4. 第四个字符是数字3,输出,总表达式为9 3,接着是“-”进栈。

算法基础四:计算表达式

5. 接下来是数字1,输出,总表达式为9 3 1,后面是符号“)”,此时,我们需要去匹配此前的“(”,所以栈顶依次出栈,并输出,直到“(”出栈为止。此时左括号上方只有“-”,因此输出“-”,总的输出表达式为9 3 1 –

6. 接着是数字3,输出,总的表达式为9 3 1 – 3 。紧接着是符号“*”,因为此时的栈顶符号为“+”号,优先级低于“*”,因此不输出,进栈。

算法基础四:计算表达式

7. 之后是符号“+”,此时当前栈顶元素比这个“+”的优先级高,因此栈中元素出栈并输出(没有比“+”号更低的优先级,所以全部出栈),总输出表达式为 9 3 1 – 3 * +.然后将当前这个符号“+”进栈。也就是说,前6张图的栈底的“+”是指中缀表达式中开头的9后面那个“+”,而下图中的栈底(也是栈顶)的“+”是指“9+(3-1)*3+”中的最后一个“+”。

8. 紧接着数字10,输出,总表达式变为9 3 1-3 * + 10。

算法基础四:计算表达式

9. 最后一个数字2,输出,总的表达式为 9 3 1-3*+ 10 2

10. 因已经到最后,所以将栈中符号全部出栈并输出。最终输出的后缀表达式结果为 9 3 1-3*+ 10 2/+

算法基础四:计算表达式
  •  
    从刚才的推导中你会发现,要想让计算机具有处理我们通常的标准(中缀)表达式的能力,最重要的就是两步:
  1. 将中缀表达式转化为后缀表达式(栈用来进出运算的符号)。
  2. 将后缀表达式进行运算得出结果(栈用来进出运算的数字)。
package com.example; import java.util.ArrayList; import java.util.Scanner; import java.util.Stack; / * 字符串算式转化为算式计算结果 * @author wuqiqi */ public class Calculate { private static boolean flag=true;//判断表达式是否有异常结果 / 将字符串转换为列表 */ public ArrayList<String> getStringList(String str){ ArrayList<String> result = new ArrayList<String>(); String num = ""; for (int i = 0; i < str.length(); i++) { if(Character.isDigit(str.charAt(i))){ num = num + str.charAt(i); }else{ if(num != ""){ result.add(num); } result.add(str.charAt(i) + ""); num = ""; } } if(num != ""){ result.add(num); } return result; } / 中缀转后缀 */ public ArrayList<String> getPostOrder(ArrayList<String> inOrderList){ ArrayList<String> result = new ArrayList<String>(); Stack<String> stack = new Stack<String>(); for (int i = 0; i < inOrderList.size(); i++) { if(Character.isDigit(inOrderList.get(i).charAt(0))){ result.add(inOrderList.get(i)); }else{ switch (inOrderList.get(i).charAt(0)) { case '(': stack.push(inOrderList.get(i)); break; case ')': while (!stack.peek().equals("(")) { result.add(stack.pop()); } stack.pop(); break; default: while (!stack.isEmpty() && compare(stack.peek(), inOrderList.get(i))){ result.add(stack.pop()); } stack.push(inOrderList.get(i)); break; } } } while(!stack.isEmpty()){ result.add(stack.pop()); } return result; } / * 计算后缀表达式 * @param postOrder * @return */ public Double calculate(ArrayList<String> postOrder){ Stack stack = new Stack(); for (int i = 0; i < postOrder.size(); i++) { if(Character.isDigit(postOrder.get(i).charAt(0))){ stack.push(Double.parseDouble(postOrder.get(i))); }else{ Double back = (Double)stack.pop(); Double front = (Double)stack.pop(); if(front==0){ flag=false; return 0.0; } Double res = 0.0; switch (postOrder.get(i).charAt(0)) { case '+': res = front + back; break; case '-': res = front - back; break; case '*': res = front * back; break; case '/': res = front / back; break; } stack.push(res); } } return (Double)stack.pop(); } / * 比较运算符等级 * @param peek * @param cur * @return */ public static boolean compare(String peek, String cur){ if("*".equals(peek) && ("/".equals(cur) || "*".equals(cur) ||"+".equals(cur) ||"-".equals(cur))){ return true; }else if("/".equals(peek) && ("/".equals(cur) || "*".equals(cur) ||"+".equals(cur) ||"-".equals(cur))){ return true; }else if("+".equals(peek) && ("+".equals(cur) || "-".equals(cur))){ return true; }else if("-".equals(peek) && ("+".equals(cur) || "-".equals(cur))){ return true; } return false; } public static void main(String[] args) { Calculate calculate = new Calculate(); Scanner sc=new Scanner(System.in); System.out.println("请输入表达式"); String s; while((s=sc.next())!=null){ ArrayList result = calculate.getStringList(s); //String转换为List result = calculate.getPostOrder(result); //中缀变后缀 double i = calculate.calculate(result); //计算 if(flag==true){ System.out.println("计算结果为:"+i); }else{ System.out.println("计算表达式有误!"); flag=true; } } } }

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/133209.html

(0)
上一篇 2025-07-25 16:15
下一篇 2025-07-25 16:26

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信