java计算器 中缀转后缀(不喜勿喷,没有毕业的时候写的)
来源:互联网 发布:酷安软件下载 编辑:程序博客网 时间:2024/06/16 16:44
public class InfixToSuffix { static Stack<String> signStack = new Stack<String>();//存放运算符的S1 static Stack<String> middleResultStack = new Stack<String>();//存放中间结果的S2 public static Stack<String> getExpression(String Infix) { System.out.println("(1) 初始化两个栈:运算符栈S1和储存中间结果的栈S2"); //从左至右扫描中缀表达式 System.out.println("(2)从左至右扫描中缀表达式"); for (int index = 0; index < Infix.length(); index++) { if (Character.isUpperCase(Infix.charAt(index))) { //遇到操作数时,将其压入S2 System.out.println("(3)遇到操作数时,将其压入S2 " + String.valueOf(Infix.charAt(index))); middleResultStack.push(String.valueOf(Infix.charAt(index))); } else { System.out.println("(4)遇到运算符时,比较其与S1栈顶运算符的优先级"); if (signStack.isEmpty()) { //如果S1为空,则直接将此运算符入栈 System.out.println("(4-1) 如果S1为空,或栈顶运算符为左括号“(”,则直接将此运算符入栈 " + String.valueOf(Infix.charAt(index))); signStack.push(String.valueOf(Infix.charAt(index))); } else { //遇到运算符时,比较其与S1栈顶运算符的优先级 char operator = Infix.charAt(index); switch (operator) { case '+' : getCompare(operator, 1); break; case '-' : getCompare(operator, 1); break; case '*' : getCompare(operator, 2); break; case '/' : getCompare(operator, 2); break; case '^' : getCompare(operator, 3); break; case 'g' : getCompare(operator, 4); break; case '(' : System.out.println("(5-1) 如果是左括号“(”,则直接压入S1"); signStack.push(String.valueOf(Infix.charAt(index))); break; case ')' : //则依次弹出S1栈顶的运算符,并压入S2,直到遇到左括号为止,此时将这一对括号丢弃 System.out.println("(5-2) 如果是右括号“)”,则依次弹出S1栈顶的运算符,并压入S2,直到遇到左括号为止,此时将这一对括号丢弃"); while (!signStack.peek().equals("(")) { middleResultStack.push(signStack.pop()); } System.out.println("弹出左右括号"); signStack.pop(); break; default : System.out.println("奇怪" + String.valueOf(Infix.charAt(index))); //middleResultStack.push(String.valueOf(Infix.charAt(index))); break; } } } } System.out.println("(7) 将S1中剩余的运算符依次弹出并压入S2 S1 : " + signStack); while (!signStack.isEmpty()) { System.out.println("最后依次弹出S1中的符号 " + signStack.peek()); middleResultStack.push(signStack.pop()); } return middleResultStack; } public static void getCompare(char ch, int prec1) { while (!signStack.isEmpty()) { String oper = signStack.peek(); int prec2 = -1; if (oper.equals("+") || oper.equals("-")) { prec2 = 1; }else if (oper.equals("*") || oper.equals("/")) { prec2 = 2; } else if (oper.equals("^")) { prec2 = 3; } else if (oper.equals("g")) { prec2 = 4; } //若优先级比栈顶运算符的高,也将运算符压入S1 if (prec1 > prec2 || oper.equals("(")) { System.out.println("(4-2) 否则,若优先级比栈顶运算符的高,也将运算符压入S1(注意转换为前缀表达式时是优先级较高或相同,而这里则不包括相同的情况) " + String.valueOf(ch)); signStack.push(String.valueOf(ch)); break; } else { //将S1栈顶的运算符弹出并压入到S2中,与S1中新的栈顶运算符相比较 System.out.println("(4-3) 否则,将S1栈顶的运算符弹出并压入到S2中,再次转到(4-1)与S1中新的栈顶运算符相比较1 " + signStack.peek()); while (!signStack.isEmpty()) { middleResultStack.push(signStack.pop()); if (!signStack.isEmpty()) { int prec3 = -1; if (signStack.peek().equals("+") || signStack.peek().equals("-")) { prec3 = 1; } else if (signStack.peek().equals("*") || signStack.peek().equals("/")) { prec3 = 2; } else if (signStack.peek().equals("^")) { prec3 = 3; } else if (signStack.peek().equals("g")) { prec3 = 4; } if (prec1 > prec3 || signStack.isEmpty() || signStack.peek().equals("(")) { System.out.println("(4-2) 否则,若优先级比栈顶运算符的高,也将运算符压入S1 " + String.valueOf(ch)); signStack.push(String.valueOf(ch)); break; } else { System.out.println("(4-3) 否则,将S1栈顶的运算符弹出并压入到S2中,再次转到(4-1)与S1中新的栈顶运算符相比较2 " + signStack.peek()); middleResultStack.push(signStack.pop()); if (signStack.isEmpty() || signStack.peek().equals("(")) { System.out.println("(4-1) 如果S1为空,或栈顶运算符为左括号“(”,则直接将此运算符入栈2 " + String.valueOf(ch)); signStack.push(String.valueOf(ch)); break; } } } else { signStack.push(String.valueOf(ch)); break; } } break; } } } public static void main(String[] args) { //A*D^B*(E+F*D+G*gD)^C //A*D^B*((E+F*E^(G*D))^H)^C //A*D^B*(E+F*D+G*gD)^C Stack<String> a = getExpression("A+B+C"); Stack<String> b = new Stack<String>(); while (!a.isEmpty()) { b.push(a.pop()); } String h = ""; while (!b.isEmpty()) { h += b.pop(); } System.out.println("(8)依次弹出S2中的元素并输出,结果的逆序即为中缀表达式对应的后缀表达式(转换为前缀表达式时不用逆序)"); System.out.println(h); }}
阅读全文
0 0
- java计算器 中缀转后缀(不喜勿喷,没有毕业的时候写的)
- 中缀转后缀并求值(简单计算器的核心)
- 中缀表达式转后缀表达式 (中缀表达式的计算)
- 中缀式转化为后缀式的步骤 (简单计算器 的实现)
- Java 中缀转后缀
- 计算器实现---中缀表达式转后缀表达式
- 计算器:中缀表达式转后缀表达式
- c++ 中缀表达式转后缀表达式 计算器
- 【栈/中缀转后缀】HDU1237简单计算器
- java 中缀转后缀(逆波兰)
- java 中缀转后缀(逆波兰)
- 【java】多项式计算(中缀转后缀)
- JAVA写的计算器
- 中缀表达式转后缀表达式求值(栈的应用)
- 中缀转后缀(栈的应用三)
- 栈的应用---(中缀表达式 转 后缀表达式)
- 中缀表达式转后缀表达式的方法
- 表达式的计算 中缀转后缀
- 测试用例设计(以QQ传输文件为例)
- db2cmd
- 每日一题之查找单链表的第K个节点
- Linux常用命令
- linux CAT与ECHO指令用法详解
- java计算器 中缀转后缀(不喜勿喷,没有毕业的时候写的)
- Unity的几中计时器
- js面向对象(只关注对象提供的功能,而不需要关系其细节)
- recycleview定位到具体的条目
- 在linux下加载一块硬盘到目录上
- GIt的安装与配置
- 博客中动态图的制作
- Hdfs存储负载均衡
- es6的核心