中缀表达式转后缀表达式并计算结果

本文介绍了一个使用Java实现的四则运算后缀表达式解析器。该解析器可以处理包含括号的算术表达式,并将其转换为后缀表达式进行计算。文章详细展示了如何通过栈和队列数据结构来实现这一过程。
部署运行你感兴趣的模型镜像

测试数据要求:非负整型数,支持包含括号的四则运算

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
import java.util.Stack;

public class Postfix {
	public static void main(String[] args) {
		Scanner sr = new Scanner(System.in);
		Queue postfix = getPostfix(sr.next());
		int result = getResult(postfix);
		System.out.println(result);
	}

	/**
	 * 
	 * @param postfix 后缀表达式在队列中的形式
	 * @return 后缀表达式的计算结果
	 */
	private static int getResult(Queue postfix) {
		Stack<Integer> numbers = new Stack<Integer>();
		while(!postfix.isEmpty()){ 
			Object temp = postfix.poll();
			//判断temp类型,如果是Integer就入栈,如果是Character就进行运算
			if(temp instanceof Integer)
				numbers.push((Integer)temp);
			else{
				//先出栈的是操作数B
				int numB = numbers.pop();
				int numA = numbers.pop();
				switch ((Character)temp) {
				case '+':
					numA += numB;
					break;
				case '-':
					numA -= numB;
					break;
				case '*':
					numA *= numB;
					break;
				case '/':
					numA /= numB;
					break;
				}
				//最后记得将运算结果入栈
				numbers.push(numA);
			}
		}
		//返回运算结果(栈底)
		return numbers.get(0);
	}

	/**
	 * 
	 * @param ss 中缀表达式
	 * @return 后缀表达式在队列中的形式
	 */
	private static Queue getPostfix(String ss) {
		Stack<Character> ops = new Stack<Character>();
		Queue<Object> postfixs = new LinkedList<Object>();
		for(int i=0;i<ss.length();i++){
			char temp = ss.charAt(i);
			//1.如果是数字就加入队列
			if(Character.isDigit(temp)){
				int number = 0;
				//数字拼接
				while(i < ss.length() && Character.isDigit(ss.charAt(i))){
					number = number*10 + Integer.parseInt(ss.substring(i,i+1));
					i++;
					
				}
				//i多加了一次,记得减掉
				i--;
				postfixs.offer(number);
			}
			//2.如果是'('就入栈
			else if(temp == '(')
				ops.push(temp);
			//3.如果是')'就出栈并加入队列直到'('出栈,其中'('只出栈不加入队列
			else if(temp == ')'){
				char popChar = ops.pop();
				while(popChar != '('){
					postfixs.offer(popChar);
					popChar = ops.pop();
				}
			}
			//4.如果是操作符的逻辑处理
			else{
				int rank = getRank(temp);
				//4.1.如果栈空或者权值比栈中前一个操作符权值大,则入栈
				if(ops.isEmpty() || rank > getRank(ops.peek()))
					ops.push(temp);
				//4.2.1否则出栈,直到栈空或者权值比栈中前一个操作符权值大
				else {
					while(!ops.isEmpty() && rank <= getRank(ops.peek()))
						postfixs.offer(ops.pop());
					//4.2.2最后记得将当前操作符入栈
					ops.push(temp);
				}
			}
		}
		//5.将堆栈中剩余操作符加入队列
		while(!ops.isEmpty())
			postfixs.offer(ops.pop());
		return postfixs;
	}
	
	/**
	 * 
	 * @param c 字符
	 * @return 输入字符的权值
	 */
	private static int getRank(char c){
		switch (c) {
		case '+':
		case '-':
			return 1;
		case '*':
		case '/':
			return 2;
		}
		return -1;
	}
}

示例:


您可能感兴趣的与本文相关的镜像

Qwen-Image

Qwen-Image

图片生成
Qwen

Qwen-Image是阿里云通义千问团队于2025年8月发布的亿参数图像生成基础模型,其最大亮点是强大的复杂文本渲染和精确图像编辑能力,能够生成包含多行、段落级中英文文本的高保真图像

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值