中缀表达式转后缀表达式一图秒杀

本文介绍一种清晰明了的方法将中缀表达式转换为后缀表达式,基于调度场算法(Shunting-Yard algorithm),并提供了一个易于理解的流程图及参考代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

大作业要求写个中缀表达式转后缀表达式,结果发现视频里面给的解法是个错的,网上找了一大堆,各种说法都有,公说公有理婆说婆有理,花里胡哨的,看着也复杂的一匹,说的话拐弯抹角的,看几下就开始看不懂了,研究到凌晨终于画了一张:秒杀大图,图是基于调度场算法(Shunting-Yard algorithm)的流程图,可以说是清晰明了,就照着图无脑撸代码就完事了

调度场算法——一图秒杀

 

代码如下(仅参考,建议还是看图自己敲的舒服):

	public Queue infixToPostfix(Queue infix) {
		Stack stack = new Stack();
		Queue postfix = new Queue();
		Boolean backtoRoot = false;
		while (!infix.isEmpty()){
			backtoRoot = false;

			Data data = infix.poll();

			if (data.type == Type.OPERATOR || data.type == Type.PAREN){
				if ("+-*/".contains(data.getOperator() )){
					while (!stack.isEmpty()) { //Stack is not empty
						Token top = stack.peek();
						if (("+-(".contains(top.getOperator()) & "/*".contains(data.getOperator())) | ((top.getOperator().equals("(")) & "-+".contains(data.getOperator() ))){ //栈顶元素优先级低于自己
							stack.push(data);
							backtoRoot = true;
							break;
						}else {
							postfix.offer(stack.pop());
							continue;
						}

					}
					if (backtoRoot){
						continue;
					}
					// Stack is empty
					if (stack.isEmpty()){
						stack.push(data);
						continue;
					}
					continue;

				}
				if ((data.getOperator().equals("(") )){
					stack.push(data);
					continue;
				}
				if (")".contains(data.getOperator() )){
					while (!stack.isEmpty() ){

						if (stack.peek().getOperator().equals("(")) {
							stack.pop();
							break;
						}
						postfix.offer(stack.pop());

					}
					continue;
				}
			}

			if (data.type == Type.OPERAND){
				postfix.offer(data);
				continue;
			}

		}


		while (!stack.isEmpty()){
			postfix.offer(stack.pop());
		}
		return postfix;
	}

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值