用栈实现中缀表达式转后缀表达式

53 篇文章 2 订阅
19 篇文章 0 订阅

转换规则:

  • 相同等级的运算符,栈外高于栈内。
  • 栈外的左括号优先级最高。
  • 栈内的左括号优先级最低。
  • 栈外的右括号优先级最低。低到和栈内的左括号优先级一样。

1.写一个类用来存储优先级,数字越小优先级越高。

public 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;
}

2.获取当前运算符的优先级。

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;
	}

3.中缀表达式转后缀表达式代码。

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);
				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];
						//优先级相等。(遇到括号)
					}else if(prioIn == prioOut){//括号的情况
							top--;
							i++;
					}else{
						//栈外高于栈内。 ---->入栈
						stack[top++] = strMid.charAt(i);
						i++;
					}
				}
			}
		}
		//判断栈内是否还有运算符
		while(top > 0){
			strLast[j++] = stack[--top];
		}
	}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值