代码(版本二)

package cn.edut.test_stack;

import java.util.Stack;

import org.junit.Test;

public class Demo02_postfix {
	@Test
	public void test01() {
		System.out.println("Test1:后缀求值");
		String s = "6 5 2 3 + 8 * + 3 + * 2 /"; //144
		System.out.println(postfix_2(s));
	}
	public static int postfix_2(String input){
		String[] tempString = input.split("\\s+"); // 空格分开字符串
		Stack<Integer> stack_Integer = new Stack<>();  //存数字
		for(String s : tempString) {
			int temp  = 0   ; 
			switch(s) {
			case "+" : 
				int b1 = stack_Integer.pop() ;
				int a1 = stack_Integer.pop() ;
				temp = a1+b1 ;
				break;
			case "-" : 
				int b2 = stack_Integer.pop() ;
				int a2 = stack_Integer.pop() ;
				temp = a2-b2 ;
				break;
			case "*" :
				int b3 = stack_Integer.pop() ;
				int a3 = stack_Integer.pop() ;
				temp = a3*b3 ;
				break; 
			case "/" : 
				int b4 = stack_Integer.pop() ;
				int a4 = stack_Integer.pop() ;
				temp = a4/b4 ;
				break;
			default: temp = Integer.parseInt(s); 
			}
			stack_Integer.push(temp) ;
		}
		if(stack_Integer.size()==1) { //算出一个值
			return  stack_Integer.pop() ;
		}else {//还有几个值没参与运算
			throw new IllegalAccessError();
		}
	}
	
}

代码(版本三)

package cn.edut.clac;

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

import org.junit.Test;

public class Calculator_Demo {
	/** * 分析表达式,返回计算值 * 外部直接调用 * @param s * @return */
	//public static int calcExpression(String s) {return }
	/** * 测试1: * 1字符串录入, * 2后缀求值 */
	@Test
	public void Test01() {
		String suffix_expression = "1 2 3 * + 4 5 + 6 * + 7 - 2 /"; //27
		//测试:字符串 =》 后缀List
		 System.out.println(parseExpression(suffix_expression).toString());
		 //测试:后缀List =》求值
		 System.out.println(doCalc(parseExpression(suffix_expression)));;
	}
	
	/** * 测试2: * 1 中缀 转后缀 * 2 中缀 转后缀 取值 */
	@Test
	public void Test02() {
		
	}
	
	/** * 分割字符 * 1 接收一个:由多个空格隔开的字符 * 2 分割这些字符 * 3 返回字符ArrayList * @param str * @return */
	private List<String> parseExpression(String str){
		//空格分开字符
		String[] strTemp = str.split("\\s+"); 
		//字符存入List
		List<String> outList = new ArrayList<>(); 
		for(String s  : strTemp) {
			outList.add(s) ; 
		}
		return outList;
	}
	
	/** * 后缀求值: * 1 接收一个List<String> * 2 遍历、分析是否为数字 * 2.1 数字 - 存入栈 * 2.2 不是数字 - 判断符号,栈中取顶、进行运算 * 3 返回值 */
	private int doCalc(List<String> str) {
		//操作的栈
		Stack<Integer> stackInteger = new Stack<>();
		for(String s : str) {
			//是数字
			if(s.matches("\\d")) {
				//数字,字符串转Integer
				stackInteger.push(Integer.parseInt(s));
			}//不是数字
			else {
				//栈中取值
				int num2 = stackInteger.pop();
				int num1 = stackInteger.pop();
				//运算的结果
				int result  = 0 ;
				//判断符号,四则运算
				switch(s) {
				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
				stackInteger.push(result) ;
			}
		}
		//返回stack的值
		return stackInteger.pop();
	}
}