其他分享
首页 > 其他分享> > 2、利用栈计算后缀表达式(逆波兰表达式)

2、利用栈计算后缀表达式(逆波兰表达式)

作者:互联网

一、需求分析

1、输入一个逆波兰表达式,利用栈计算其结果;
2、支持小括号和多位数整数;

二、思路分析

例如:(3+5)*5-6对应的后缀表达式为3 5 + 5 * 6 -,其求值步骤如下:
1.从左到右扫描,遇见数字直接入栈,3和5入栈;
2.遇见操作符+,从栈中弹出两个数3和5,根据操作符计算结果为8,并将结果8入栈;
3.将5入栈;
4.遇见操作符*,弹出两个操作符5和8,计算结果为5*8=40,将40入栈;
5.将6入栈;
6.遇见操作符-,弹出两个数字6和40,计算结果为40-6=34,将34入栈;
7.字符串扫描完毕,栈中剩余数字34就是最终答案。

三、代码

package com.stack;

import java.util.ArrayList;
import java.util.List;
import java.util.Stack;

/**
 * 例如:(3+5)\*5-6对应的后缀表达式为3 5 + 5 \* 6 -,其求值步骤如下: 
 * 1.从左到右扫描,遇见数字直接入栈,3和5入栈;
 * 2.遇见操作符+,从栈中弹出两个数3和5,根据操作符计算结果为8,并将结果8入栈; 
 * 3.将5入栈;
 * 4.遇见操作符*,弹出两个操作符5和8,计算结果为5*8=40,将40入栈; 
 * 5.将6入栈;
 * 6.遇见操作符-,弹出两个数字6和40,计算结果为40-6=34,将34入栈; 
 * 7.字符串扫描完毕,栈中剩余数字34就是最终答案。
 * 
 * @author chaixf
 *
 */
public class PolandNotation {
	public static void main(String[] args) {
		// 定义逆波兰表达式
		String suffixExpression = "3 5 + 5 * 6 -";
		// 思路
		// 1、先将"3 5 + 5 * 6 -" => ArrayList中
		// 2、将ArrayList传给一个方法,结算结果
		List<String> list = getListString(suffixExpression);
		// 计算结果
		int res = calculate(list);
		System.out.printf("3 5 + 5 * 6 -的计算结果为:%d",res);
	}

	public static List<String> getListString(String suffixExpression){
		// 将suffixExpression进行分割
		String[] split = suffixExpression.split(" ");
		// 将split放进ArrayList中
		ArrayList<String> arrayList = new ArrayList<String>();
		for(String item:split) {
			arrayList.add(item);
		}
		return arrayList;
	}
	
	public static int calculate(List<String> list) {
		// 创建一个栈
		Stack<Integer> stack = new Stack<Integer>();
		for(String item:list) {
			if(item.matches("\\d+")) {// 匹配到的是数字
				stack.push(Integer.parseInt(item));
			}else {// 匹配到的是操作符
				// 弹出两个数并计算结果
				int num2 = stack.pop();
				int num1 = stack.pop();
				int result = 0;
				switch (item) {
				case "+":
					result = num1 + num2;
					break;
				case "-":
					result = num1 - num2;
					break;
				case "*":
					result = num1 * num2;
					break;
				case "/":
					result = num1 / num2;
					break;
				default:
					throw new RuntimeException("操作符错误!");
				}
				// 将结果入栈
				stack.push(result);
			}
		}
		// 返回栈中的最后一个数据
		return stack.pop();
	}
}

标签:入栈,后缀,ArrayList,40,操作符,计算结果,波兰,stack,表达式
来源: https://blog.csdn.net/Chaixf8/article/details/114039615