洛谷-p1449 后缀表达式-java解题方法

题目描述

所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右新进行(不用考虑运算符的优先级)。

如:3*(5–2)+7对应的后缀表达式为:3.5.2.-*7.+@。’@’为表达式的结束符号。‘.’为操作数的结束符号。

输入格式

输入:后缀表达式

输出格式

输出:表达式的值

注意

String.split()函数进行分割时有些符号需要转义。

题解

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String []s = br.readLine().split("\\."); // 转义利用句号进行分割
		char [][]rpn = new char[s.length][]; 
		for(int i=0;i<s.length;i++) { // 将分割的多段字符串存在二维字符数组里,一行对应上面一段字符
			rpn[i] = s[i].toCharArray();
		}
//		for(int i=0;i<rpn.length;i++) {
//			for(int j=0;j<rpn[i].length;j++) {
//				System.out.print(rpn[i][j]+" ");
//			}
//			System.out.println();
//		}
		Stack<Integer> number = new Stack<>(); // 创建堆栈放入操作数
		int a,b;
		int count,sum =0 ;
		for(int i=0;i<rpn.length;i++) {
			for(int j=0;j<rpn[i].length;j++) {
				if(rpn[i][j]=='@') {
					break;
				}
				if(rpn[i][j]=='+') {
					a = number.pop();
					b = number.pop();
					number.push(b+a);
				}else if(rpn[i][j]=='-') {
					a = number.pop();
					b = number.pop();
					number.push(b-a);
				}else if(rpn[i][j]=='*') {
					a = number.pop();
					b = number.pop();
					number.push(b*a);
				}else if(rpn[i][j]=='/') {
					a = number.pop();
					b = number.pop();
					number.push(b/a);
				}else {
					count = rpn[i].length-j-1; // 判断是几位数并进行处理后加入堆栈
					if(count>0) {
						sum += (int)(rpn[i][j]-48)*Math.pow(10, count--);
					}else {
						sum += (int)(rpn[i][j]-48);
						number.push(sum);
//						System.out.println("加入操作数"+sum);
						sum = 0;
					}
				}
			}
		}
		System.out.println(number.pop());
	}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杜柠函

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值