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

参考

数据结构Java实现06----中缀表达式转换为后缀表达式

将中缀表达式转化为后缀表达式



Mycode

 1 package collection_Exe;
 2
 3 import java.util.*;
 4
 5 public class Exe16 {
 6     public static void main(String[] args) {
 7         Scanner input = new Scanner(System.in);
 8         System.out.println("Input :");
 9         String string = input.nextLine();
10         input.close();
11         String[] strs = string.split(" ");
12         Set<String> set = new HashSet<>();
13         set.add("+");
14         set.add("-");
15         set.add("*");
16         set.add("/");
17         set.add("(");
18         set.add(")");
19         Stack<String> stack = new Stack<>();
20         Stack<String> operator = new Stack<>();
21         for(String str : strs) {
22             if(!set.contains(str)) {
23                 stack.push(str);
24             } else {
25                 switch (str) {
26                 case "+":
27                 case "-":
28                     if(!operator.isEmpty() &&
29                        !operator.peek().equals("(")) {
30                         stack.push(operator.pop());
31                     }
32                     operator.push(str);
33                     break;
34                 case "*":
35                 case "/":
36                     if(!operator.isEmpty() &&
37                        (operator.peek().equals("*") ||
38                          operator.peek().equals("/"))) {
39                         stack.push(operator.pop());
40                     }
41                     operator.push(str);
42                     break;
43                 case "(":
44                     operator.push(str);
45                     break;
46                 case ")":
47                     while (!operator.peek().equals("(")) {
48                         stack.push(operator.pop());
49                     }
50                     operator.pop();
51                     break;
52                 default:
53                     System.out.println("Error");
54                     break;
55                 }
56             }
57         }
58         while(!operator.isEmpty()) {
59             stack.push(operator.pop());
60         }
61         System.out.println(stack.toString());
62     }
63 }

你以为我会写注释吗?不可能的。

运行结果如下:

像我这种不拘小节的男人,是不会在意同优先级运算顺序的。

大概上,算法是没什么错误的。



再附上一个程序,同样不会写注释的。

 1 package collection_Exe;
 2
 3 import java.util.HashSet;
 4 import java.util.Scanner;
 5 import java.util.Set;
 6 import java.util.Stack;
 7
 8 public class Exe14 {
 9     public static void main(String[] args) {
10         Scanner input = new Scanner(System.in);
11         System.out.println("Input:");
12         String str = input.nextLine();
13         input.close();
14         String[] strs = proStr(str);
15         Stack<Integer> stack = new Stack<>();
16         Set<String> set = new HashSet<>();
17         set.add("+");
18         set.add("-");
19         set.add("*");
20         set.add("/");
21         for(String s : strs) {
22             if(set.contains(s)) {
23                 processStack(stack, s.charAt(0));
24             } else {
25                 stack.push(Integer.parseInt(s));
26             }
27         }
28         System.out.println("Result : " + stack.pop());
29     }
30
31     public static void processStack(Stack<Integer> stack, Character op) {
32         Integer num2 = stack.pop();
33         Integer num1 = stack.pop();
34         Integer num3 = null;
35         switch (op) {
36         case ‘+‘:
37             num3 = num1 + num2;
38             break;
39         case ‘-‘:
40             num3 = num1 - num2;
41             break;
42         case ‘*‘:
43             num3 = num1 * num2;
44             break;
45         case ‘/‘:
46             num3 = num1 / num2;
47             break;
48         default:
49             System.out.println("ERROR IN processStack.");
50             break;
51         }
52         stack.push(num3);
53     }
54
55     public static String[] proStr(String str) {
56         return str.split(" ");
57     }
58 }

自己凭本事写的bug。

时间: 2024-11-20 15:37:15

中缀表达式转成后缀表达式的相关文章

中缀表达式转换成后缀表达式并求值

算法: 中缀表达式转后缀表达式的方法: 1.遇到操作数:直接输出(添加到后缀表达式中) 2.栈为空时,遇到运算符,直接入栈 3.遇到左括号:将其入栈 4.遇到右括号:执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,左括号不输出. 5.遇到其他运算符:加减乘除:弹出所有优先级大于或者等于该运算符的栈顶元素,然后将该运算符入栈 6.最终将栈中的元素依次出栈,输出. 例如 a+b*c+(d*e+f)*g ----> abc*+de*f+g*+ 遇到a:直接输出: 后缀表达式:a 堆栈:空 遇到

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

中缀表达式即普通的运算式子,运算符是以中缀形式处于操作数的中间(例:3 + 4),后缀表达式就是逆波兰式(例:3 4 +),中缀表达式转后缀表达式也是学习数据结构中的栈的时候一个典型的例子,结合上一次写到逆波兰式.可以用这种原理即输入普通式子(即中缀表达式),转换成后缀表达式,然后通过后缀表达式(逆波兰式)的计算,可以得出结果. 1 #include <stdio.h> 2 #include <stdlib.h> 3 #define STACK_INIT_SIZE 20 4 #de

表达式树—中缀表达式转换成后缀表达式(一)

算法: 中缀表达式转后缀表达式的方法:1.遇到操作数:直接输出(添加到后缀表达式中)2.栈为空时,遇到运算符,直接入栈3.遇到左括号:将其入栈4.遇到右括号:执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,左括号不输出.5.遇到其他运算符:加减乘除:弹出所有优先级大于或者等于该运算符的栈顶元素,然后将该运算符入栈6.最终将栈中的元素依次出栈,输出.例如a+b*c+(d*e+f)*g ----> abc*+de*f+g*+ 遇到a:直接输出:后缀表达式:a堆栈:空 遇到+:堆栈:空,所以+

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

中缀表达式(标准形式):A+(B-C/D+E)*F 后缀表达式(便于计算机计算):ABCD/-E+F*+ 本文使用栈来实现中缀表达式到后缀表达式的转换. 操作数:A B C D E F 操作符:+ - / * ( ) 操作符优先级:( )  >  / *  >  + - 逐个字符读取中缀表达式,结果不断输出,利用栈对操作符进行缓存: 1. 遇到操作数直接输出 2. 遇到操作符,如果此操作符优先级大于栈顶操作符,则将此操作符压栈,否则输出栈顶操作符:如遇到),则把栈内操作符依次弹出,直到(,()

3-6 中缀表达式转换成后缀表达式

1>e:\极速考拉下载目录\vs2013(visual studio 2013旗舰版)\vc\include\xtgmath.h(214): warning C4602: #pragma pop_macro:"new"该标识符前面没有 #pragma push_macro1>e:\极速考拉下载目录\vs2013(visual studio 2013旗舰版)\vc\include\xtgmath.h(215): warning C4193: #pragma warning(p

八、通过中缀计算表达式转换成后缀计算表达式

前言:中缀表达式符合人们的阅读习惯:  如:5+3 后缀表达式符合计算机的运算习惯:如:53+ 现在通过栈对运算符号的入栈.出栈操作实现将中缀表达式转化成后缀表达式 1.LinkList.h #ifndef _LINKLIST_H_ #define _LINKLIST_H_ typedef void LinkList; typedef struct _tag_LinkListNode LinkListNode; struct _tag_LinkListNode { LinkListNode* n

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

35,15,+,80,70,-,*,20,/                   //后缀表达方式 (((35+15)*(80-70))/20)=25           //中缀表达方式 /,*,+,35,15,-,80,70, 20                 //前缀表达方式 人的思维方式很容易固定~~!正如习惯拉10进制.就对2,3,4,8,16等进制不知所措一样~~! 人们习惯的运算方式是中缀表达式.而碰到前缀,后缀方式..迷茫其实仅仅是一种表达式子的方式而已(不被你习惯的方式)我

运用栈把算术表达式+,-,*,/,%(中缀表达式)转换成后缀表达式并且计算出值

原理: 1.首先判断是数值还是符号,如果是数值放进字符数组以#表示结束, 2.如果是符号,放进栈, 3.每个符号之间要比较优先级,如果栈顶符号优先级低,符号进栈,如果相等(即“(” “)”)出栈,栈顶符号优先级高,栈顶元素出栈进入字符数组,得到后缀表达式 4.计算后缀表达式,判断是数字还是符号.直到遇到符号,将前面的数字计算后放进栈,一直重复,知道“\0” 代码(局限用整数,因为有模运算,若要任何类型的代码,我的blog有) 1 #include <stdio.h> 2 #include &l

将中缀表达式转化为后缀表达式

我们把平时所用的标准四则运算表达式,即“9+(3-1)*3+10/2"叫做中缀表达式.因为所有的运算符号都在两数字的中间,现在我们的问题就是中缀到后缀的转化. 中缀表达式“9+(3-1)*3+10/2”转化为后缀表达式“9 3 1-3*+ 10 2/+” 规则:从左到右遍历中缀表达式的每个数字和符号,若是数字就输出,即成为后缀表达式的一部分:若是符号,则判断其与栈顶符号的优先级,是右括号或优先级低于找顶符号(乘除优先加减)则栈顶元素依次出找并输出,并将当前符号进栈,一直到最终输出后缀表达式为止.