Java 后缀表达式实现计算器(逆波兰计算器)

逆波兰计算器的实现

  1. 输入一个逆波兰表达式(后缀表达式), 使用栈(Stack), 计算其结果
  2. 支持小括号和多位数整数, 因为这里我们主要针对于数据结构, 因此计算器进行简化, 只支持对整数的计算
  3. 思路分析
  4. 代码完成
package com.beyond.stack;

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

public class PolandNotation {
    
    

	public static void main(String[] args) {
    
    
		// 先定义一个逆波兰表达式
		// (3+4)*5-6  => 3 4 + 5 * 6 -
		// 为了方便, 逆波兰表达式 的数字和符号使用空格隔开
		String suffixExpression = "3 4 + 5 * 6 -";
		
		// 思路:
		// 1. 先将 "3 4 + 5 * 6 -" => 放到 ArrayList中
		// 2. 将 ArrayList 传递给一个方法, 遍历ArrayList 配合 栈 完成计算
		
		List<String> rpnList = getListString(suffixExpression);
		System.out.println(rpnList);
		System.out.println(calculate(rpnList));
	}

	
	// 将一个逆波兰表达式, 依次将数据和运算符 放入 ArrayList 中
	public static List<String> getListString(String suffixExpression){
    
    
		// 将suffixExpression 分割
		String split [] = suffixExpression.split(" ");
		List<String> list = new ArrayList<String>();
		for(String ele: split) {
    
    
			list.add(ele);
		}
		return list;
	}
	
	// 完成对逆波兰表达式的运算
	/**
	 * 1. 从左到右扫描, 将3和4压入堆栈;
	 * 2. 遇到 + 运算符, 因此弹出 4和3 (4 为栈顶元素,3为次栈顶元素), 计算 3+4 的值, 得7, 再将7 入栈
	 * 3. 将 5 入栈
	 * 4. 接下来是 * 运算符, 因此 弹出 5和7, 计算出 7*5 = 35, 将35 入栈
	 * 5. 将6入栈
	 * 6. 最后是 - 运算符, 计算出 35 -6 的值, 即29, 由此得出最终结果
	 */
	public static int calculate(List<String> ls) {
    
    
		// 创建个栈, 一个栈即可
		Stack<String> stack = new Stack<String>();
		// 遍历 ls
		for(String item: ls) {
    
    
			// 使用一个正则表达式来取出数
			if (item.matches("\\d+")) {
    
      // 匹配的是多位数
				// 入栈
				stack.push(item);
			}else {
    
    
				// pop 出两个数, 并运算, 再入栈
				int num2 = Integer.parseInt(stack.pop());
				int num1 = Integer.parseInt(stack.pop());
				int res = 0; 
				if (item.equals("+")) {
    
    
					res = num1 + num2;
				}else if (item.equals("-")) {
    
    
					res = num1 - num2;
				}else if (item.equals("*")) {
    
    
					res = num1 * num2;
				}else if (item.equals("/")) {
    
    
					res = num1 / num2;
				}else {
    
    
					throw new RuntimeException("运算符有误!");
				}
				
				// 把 res 入栈
				stack.push(String.valueOf(res)); // 转成字符串, 还可以 Integer.toString(res) 或者使用 +""
				
			}
		}
	
		// 最后留在 stack 中的数据就是运算结果
		return Integer.parseInt(stack.pop());
		
	}
	
	
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Beyond_Nothing/article/details/112062330