Evaluate Reverse Polish Notation

仅提供个人的一种解题思路,未必是最优,仅供各位参考!

import java.util.Stack;

/**
 * 
 * <p>
 * ClassName SolutionEvaluateReversePolishNotation
 * </p>
 * <p>
 * Description 该题是解逆波兰表达式 Evaluate the value of an arithmetic expression in Reverse Polish Notation.
 * 
 * Valid operators are +, -, *, /. Each operand may be an integer or another expression.
 * 
 * Some examples: ["2", "1", "+", "3", "*"] -> ((2 + 1) * 3) -> 9 ["4", "13", "5", "/", "+"] -> (4 + (13 / 5)) -> 6
 * </p>
 * 
 * @author wangxu wangx89@126.com
 *         <p>
 *         Date 2014-9-11 下午08:11:44
 *         </p>
 * @version V1.0
 * 
 */
public class SolutionEvaluateReversePolishNotation {
	public static int evalRPN(String[] tokens) {
		// 基本思路是采用栈来存储数字,然后读取token,当读取到的是+-*/时候,进行出栈操作

		Stack<Integer> numStack = new Stack<Integer>();// 存储数字的栈
		Stack<String> opStack = new Stack<String>();// 存储操作符的栈
		int length = tokens.length;
		String op = "";
		for (int i = 0; i < length; i++) {

			String temp = tokens[i];
			if ("+".equals(temp)) {
				if (i < length - 1) {// 说明当前操作符并非最后一个
					op = tokens[i + 1];// 取出当前操作符的后一个,比较他们的优先级,如果后一个比当前优先级高,那么当前操作符入栈,如果后一个没有当前优先级高,那么计算当前的操作符
					if ("*".equals(op) || "/".equals(op)) {// 只有当后面一个是*或者/时,将当前操作符入栈
						opStack.push("+");
					} else {
						// 说明可能是+或者-或者数字,但不影响运算顺序
						// 直接使用当前操作符计算即可
						int num1 = numStack.pop();
						int num2 = numStack.pop();
						numStack.push(num2 + num1);

					}
				} else {// 说明已经是最后一个操作符了
					int num1 = numStack.pop();
					int num2 = numStack.pop();
					numStack.push(num2 + num1);

				}
			} else if ("-".equals(temp)) {

				if (i < length - 1) {
					op = tokens[i + 1];
					if ("*".equals(op) || "/".equals(op)) {
						opStack.push("-");
					} else {
						// 直接使用当前操作符计算即可
						int num1 = numStack.pop();
						int num2 = numStack.pop();
						numStack.push(num2 - num1);

					}
				} else {
					int num1 = numStack.pop();
					int num2 = numStack.pop();
					numStack.push(num2 - num1);
				}

			} else if ("*".equals(temp)) {

				int num1 = numStack.pop();
				int num2 = numStack.pop();
				numStack.push(num2 * num1);

			} else if ("/".equals(temp)) {

				int num1 = numStack.pop();
				int num2 = numStack.pop();
				numStack.push(num2 / num1);

			} else {
				int t = Integer.parseInt(temp);
				numStack.push(t);
			}

			// 开始判断操作符栈,如果操作符栈非空,那么需要先将其出栈操作
			while (!opStack.isEmpty()) {
				String opTemp = opStack.pop();
				if ("+".equals(opTemp)) {
					int num1 = numStack.pop();
					int num2 = numStack.pop();
					numStack.push(num2 + num1);
				} else if ("-".equals(opTemp)) {
					int num1 = numStack.pop();
					int num2 = numStack.pop();
					numStack.push(num2 - num1);
				}

			}
		}

		return numStack.pop();
	}

	public static void main(String[] args) {
		String str[] = { "-78", "-33", "196", "+", "-19", "-", "115", "+", "-", "-99", "/", "-18", "8", "*", "-86", "-", "-", "16", "/", "26", "-14", "-", "-", "47",
				"-", "101", "-", "163", "*", "143", "-", "0", "-", "171", "+", "120", "*", "-60", "+", "156", "/", "173", "/", "-24", "11", "+", "21", "/", "*", "44",
				"*", "180", "70", "-40", "-", "*", "86", "132", "-84", "+", "*", "-", "38", "/", "/", "21", "28", "/", "+", "83", "/", "-31", "156", "-", "+", "28", "/",
				"95", "-", "120", "+", "8", "*", "90", "-", "-94", "*", "-73", "/", "-62", "/", "93", "*", "196", "-", "-59", "+", "187", "-", "143", "/", "-79", "-89",
				"+", "-" };
		int res = evalRPN(str);
		System.out.println(res);

	}
}


好的,以下是代码实现: ```c #include <stdio.h> #include <stdlib.h> #include <ctype.h> typedef struct ExpressionTree { int element; struct ExpressionTree* left_tree; struct ExpressionTree* right_tree; } ExpressionTree, *ExpressionTreeRoot; int evaluate(ExpressionTreeRoot T) { if (T->left_tree == NULL && T->right_tree == NULL) { return T->element; } else { int left_value = evaluate(T->left_tree); int right_value = evaluate(T->right_tree); switch (T->element) { case '+': return left_value + right_value; case '-': return left_value - right_value; case '*': return left_value * right_value; case '/': return left_value / right_value; default: return 0; } } } void in_fix(ExpressionTreeRoot T, bool is_root) { if (T == NULL) return; if (T->left_tree != NULL) { if (!is_root && is_leaf(T->left_tree)) { printf("("); } in_fix(T->left_tree, false); } printf("%c", T->element); if (T->right_tree != NULL) { in_fix(T->right_tree, false); if (!is_root && is_leaf(T->right_tree)) { printf(")"); } } } void reverse_polish(ExpressionTreeRoot T) { if (T == NULL) return; reverse_polish(T->left_tree); reverse_polish(T->right_tree); printf("%c", T->element); } bool is_leaf(ExpressionTreeRoot T) { return T->left_tree == NULL && T->right_tree == NULL; } int main() { ExpressionTreeRoot root = (ExpressionTree*)malloc(sizeof(ExpressionTree)); root->element = '+'; root->left_tree = (ExpressionTree*)malloc(sizeof(ExpressionTree)); root->left_tree->element = '*'; root->right_tree = (ExpressionTree*)malloc(sizeof(ExpressionTree)); root->right_tree->element = '-'; root->left_tree->left_tree = (ExpressionTree*)malloc(sizeof(ExpressionTree)); root->left_tree->left_tree->element = 3; root->left_tree->right_tree = (ExpressionTree*)malloc(sizeof(ExpressionTree)); root->left_tree->right_tree->element = 4; root->right_tree->left_tree = (ExpressionTree*)malloc(sizeof(ExpressionTree)); root->right_tree->left_tree->element = 5; root->right_tree->right_tree = (ExpressionTree*)malloc(sizeof(ExpressionTree)); root->right_tree->right_tree->element = 2; printf("Infix expression: "); in_fix(root, true); printf("\n"); printf("Reverse Polish notation: "); reverse_polish(root); printf("\n"); printf("Result: %d\n", evaluate(root)); return 0; } ``` 这个程序将建立一个如下所示的表达式树: ``` + / \ * - / \ / \ 3 4 5 2 ``` 并且提供了三个操作: - `in_fix`:以中缀方式输出表达式 - `reverse_polish`:以后缀方式输出表达式 - `evaluate`:计算整个表达式树的结果 你可以根据需要进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值