标签:
表达式求值的步骤:
1.将中缀表达式改为后缀表达式
2.后缀表达式求值
第一个问题:将中缀表达式改为后缀表达式
》准备2个堆栈(后缀表达式栈、运算符栈)
》读取中缀表达式的每个对象,对不同对象按不同的情况处理
1.运算数:直接输出
2.左括号:压入堆栈
3.右括号:将栈顶的运算符弹出并输出,直到遇到左括号(出栈不输出)
4.运算符:
a.若优先级大于栈顶运算符时,则进行压栈
b.若优先级小于等于栈顶运算符时,将栈顶运算符弹出并输出;再比较新的栈顶运算符,直到该运算符大于栈顶运算符优先级为止,然后将该运算符压栈
package com.wpr.courseDemo1; import java.util.Stack; public class Calculate { //运算符的优先关系 //‘+‘, ‘-‘, ‘*‘, ‘/‘, ‘(‘, ‘)‘ static char OprRelation[][] = {{‘>‘, ‘>‘, ‘<‘, ‘<‘, ‘<‘, ‘>‘}, //‘+‘ {‘>‘, ‘>‘, ‘<‘, ‘<‘, ‘<‘, ‘>‘}, //‘-‘ {‘>‘, ‘>‘, ‘>‘, ‘>‘, ‘<‘, ‘>‘}, //‘*‘ {‘>‘, ‘>‘, ‘>‘, ‘>‘, ‘<‘, ‘>‘}, //‘/‘ {‘<‘, ‘<‘, ‘<‘, ‘<‘, ‘<‘, ‘=‘}, //‘(‘ {‘>‘, ‘>‘, ‘>‘, ‘>‘, ‘=‘, ‘>‘} //‘)‘ }; //判断是否为运算符,暂时只支持+-*/() static boolean isOperator(char c){ if(c==‘+‘||c==‘-‘||c==‘*‘||c==‘/‘||c==‘(‘||c==‘)‘){ return true; } return false; } //将运算符转化为数组下标以便进行优先级比较 static int ConvertToIndex(char opr) { int index = -1; switch (opr) { case ‘+‘: index = 0; break; case ‘-‘: index = 1; break; case ‘*‘: index = 2; break; case ‘/‘: index = 3; break; case ‘(‘: index = 4; break; case ‘)‘: index = 5; break; } return index; } //运算符优先级比较 static char precede(char opr1, char opr2) { int index1 = ConvertToIndex(opr1); int index2 = ConvertToIndex(opr2); return OprRelation[index1][index2]; } static Stack<Character> postfix = new Stack<>(); static Stack<Character> oper = new Stack<>(); public static void main(String args[]) { String str = "2*(9+6/3-5)+4"; char[] s =str.toCharArray(); for(char c:s){ //分4种情况讨论 if(!isOperator(c)){ //No1.运算数类型,直接压栈 postfix.push(c); }else{ //运算符类型 if(‘(‘==c){ //No2.遇到左括号,直接压栈 oper.push(c); }else if(‘)‘==c){ //No3.遇到右括号 char temp = oper.pop(); while(temp!=‘(‘){ postfix.push(temp); temp = oper.pop(); } }else{ //No4.遇到了运算符 operNG(c); } } } while(!oper.isEmpty()){ postfix.push(oper.pop()); } //显示一下后缀表达式 for(char c:postfix){ System.out.print(c+"\t"); } } //处理算术符的优先级不大于栈顶的优先级的情况 static void operNG(char c){ if(oper.isEmpty()){ //如果栈是空的 oper.push(c); }else{ //栈不空 char temp = oper.peek();//得到栈顶元素但不删除 if(precede(temp, c)==‘<‘){ //栈顶元素优先级<当前运算符的优先级 oper.push(c); }else{ postfix.push(oper.pop()); operNG(c); }; } } }
以上则完成了将中缀表达式化为后缀表达式
标签:
原文地址:http://www.cnblogs.com/kakaxisir/p/4245894.html