中缀表达式, 是一个通用的算术或逻辑公式表示方法, 操作符是以中缀形式处于操作数的中间(例:3 + 4),中缀表达式是人们常用的算术表示方法
后缀表达式(逆波兰式),指的是不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行.
中缀表达式转后缀表达式选择题做法:
代码实现:
/**
* 中缀表达式转换为后缀表达式
*
*
* 规则:
* 相同等级的栈内高于栈外
* 栈外左括号优先级最高
* 栈内左括号优先级最低
* 栈外右括号优先级最低,和栈内左括号优先级一样低
* */
class Constant {//先定义各种运算的优先级。数字越小,说明优先级越高
public static final int OPERATORS_PRIO_PLUS_IN = 4; //栈内加法
public static final int OPERATORS_PRIO_SUB_IN = 4; //栈内减法
public static final int OPERATORS_PRIO_MULTY_IN = 2; //栈内乘法
public static final int OPERATORS_PRIO_DIV_IN = 2 ; //栈内除法
public static final int OPERATORS_PRIO_LEFT_BRAK_IN = 10; //栈内左括号
public static final int OPERATORS_PRIO_PLUS_OUT = 5 ; //栈外加法
public static final int OPERATORS_PRIO_SUB_OUT = 5; //栈外减法
public static final int OPERATORS_PRIO_MULTY_OUT = 3; //栈外乘法
public static final int OPERATORS_PRIO_DIV_OUT = 3; //栈外除法
public static final int OPERATORS_PRIO_LEFT_BRAK_OUT = 1; //栈外左括号
public static final int OPERATORS_PRIO_RIGHT_BRAK_OUT = 10; //栈外右括号
public static final int OPERATORS_PRIO_ERROR = -1;
}
public class test {
//获取优先级
public static int Get_Prio(char opera,boolean instack)
{
int prio = Constant.OPERATORS_PRIO_ERROR;
if(instack)
{
switch(opera)
{
case '+':
prio = Constant.OPERATORS_PRIO_PLUS_IN;
break;
case '-':
prio = Constant.OPERATORS_PRIO_SUB_IN;
break;
case '*':
prio = Constant.OPERATORS_PRIO_MULTY_IN;
break;
case '/':
prio = Constant.OPERATORS_PRIO_DIV_IN;
break;
case '(':
prio = Constant.OPERATORS_PRIO_LEFT_BRAK_IN;
break;
default:
prio = Constant.OPERATORS_PRIO_ERROR;
break;
}
}
else
{
switch(opera)
{
case '+':
prio = Constant.OPERATORS_PRIO_PLUS_OUT;
break;
case '-':
prio = Constant.OPERATORS_PRIO_SUB_OUT;
break;
case '*':
prio = Constant.OPERATORS_PRIO_MULTY_OUT;
break;
case '/':
prio = Constant.OPERATORS_PRIO_DIV_OUT;
break;
case '(':
prio = Constant.OPERATORS_PRIO_LEFT_BRAK_OUT;
break;
case ')':
prio = Constant.OPERATORS_PRIO_RIGHT_BRAK_OUT;
break;
default:
prio = Constant.OPERATORS_PRIO_ERROR;
break;
}
}
return prio;
}
public static void getprio(){}
public static void strmidtolast(String strmid,char[]strlast){
char[]stack=new char[strmid.length()];
int top=0;
int len=strmid.length();
int i=0;//计数
int j=0;//用来表示strlast的下标
int prioin;//表示栈内优先级
int prioout;//表示栈外优先级
while(i!=len){
//判断当前的字符是不是数字
if(Character.isDigit(strmid.charAt(i))){
strlast[j]=strmid.charAt(i);//如果是数字,则直接把当前字符放入strlast
j++;
i++;
}else{//如果不是数字
if(top==0){//此时栈为空
stack[top++]=strmid.charAt(i);//直接入栈
i++;
}
else{//栈不为空,得先比较优先级
prioin=Get_Prio(stack[top-1],true);//先得到优先级
prioout=Get_Prio(strmid.charAt(i),false);
//栈内优先级高于栈外
if(prioin<prioout){
strlast[j++]=stack[--top];//直接把栈内的元素给strlast
}
else if(prioin==prioout){//如果俩个优先级相同,则说明遇到了括号,只需要把括号放在一边不管即可
top--;
i++;
}else{//栈内优先级低于栈外
stack[top++]=strmid.charAt(i);//直接让元素入栈
i++;
}
}
}
}//判断栈内是否还有运算符
while(top>0){//如果栈内还有运算符,直接把运算符按顺序赋给strlast
strlast[j++]=stack[top--];
}
}
//打印数组
public static void show(char[]strlast ){
for (int i=0;i<strlast.length;i++){
System.out.print(strlast[i]+" ");
}
}
public static void main(String[] args) {
String strmid="2+3*5-4*(5-3)";
char[]strlast= new char [strmid.length()];
strmidtolast( strmid,strlast);
show(strlast);
}
}