简单的算术表达式求值

Dijkstra 双栈算数表达式求值法 

输入输出采用了 算法4 java库

package first_java;

import java.util.Stack;

import edu.princeton.cs.algs4.StdIn;
import edu.princeton.cs.algs4.StdOut;

public class Evaluate {
	public static void main(String[] args) {
		Stack<Double> vals = new Stack<Double>();
		Stack<String> ops = new Stack<String>();
		while(!StdIn.isEmpty()) {
			String str = StdIn.readString();
			if(str.equals("("));
			else if(str.equals("+"))
				ops.push(str);
			else if(str.equals("-"))
				ops.push(str);
			else if(str.equals("*"))
				ops.push(str);
			else if(str.equals("/"))
				ops.push(str);
			else if(str.equals("sqrt"))
				ops.push(str);
			else if(str.equals(")")) {
				double v = vals.pop();
				String op = ops.pop();
				if(op.equals("+")) {
					v = vals.pop() + v;
					vals.push(v);
				}
				else if(op.equals("-")) {
					v = vals.pop() - v;
					vals.push(v);
				}
				else if(op.equals("*")) {
					v = vals.pop() * v;
					vals.push(v);
				}
				else if(op.equals("/")) {
					v = vals.pop() / v;
					vals.push(v);
				}
				else if(op.equals("sqrt")) {
					v = Math.sqrt(v);
					vals.push(v);
				}
			}
			else vals.push(Double.parseDouble(str));

		}
		StdOut.println("The final anwser is :  " + vals.pop());
	}

}
  该方法存在的局限性很大
   1.运算符与数字之间需用空格隔开
   2.括号中最多只能有一次运算
   3.括号不能省
### B2130 简单算术表达式求值问题解析 简单算术表达式求值通常涉及对字符串形式的数学表达式进行解析和计算。这一过程可以通过栈(stack)数据结构来实现,因为栈可以有效地处理括号匹配以及运算符优先级的问题[^1]。 以下是一个基于 Python 的实现方法,它能够处理加法、减法、乘法和除法,并支持括号嵌套: ```python def evaluate_expression(expression): def apply_operator(operators, values): operator = operators.pop() right = values.pop() left = values.pop() if operator == '+': values.append(left + right) elif operator == '-': values.append(left - right) elif operator == '*': values.append(left * right) elif operator == '/': values.append(int(left / right)) # 使用整数除法 def precedence(operator): if operator in ('+', '-'): return 1 if operator in ('*', '/'): return 2 return 0 operators = [] values = [] i = 0 while i < len(expression): if expression[i] == ' ': i += 1 continue elif expression[i] == '(': operators.append(expression[i]) elif expression[i].isdigit(): num = 0 while i < len(expression) and expression[i].isdigit(): num = num * 10 + int(expression[i]) i += 1 values.append(num) i -= 1 elif expression[i] == ')': while operators[-1] != '(': apply_operator(operators, values) operators.pop() # 移除 '(' else: # 运算符 while (operators and operators[-1] != '(' and precedence(operators[-1]) >= precedence(expression[i])): apply_operator(operators, values) operators.append(expression[i]) i += 1 while operators: apply_operator(operators, values) return values[0] # 示例调用 expression = "3 + (2 * 2) - 4 / 2" result = evaluate_expression(expression) print(f"Result of '{expression}' is {result}") ``` 上述代码实现了对一个包含基本算术运算符和括号的表达式的解析与求值。其核心思想是通过两个栈分别存储操作数和操作符,同时根据操作符的优先级决定何时执行计算[^1]。 #### 关键点说明 - **操作数栈**:用于存储待处理的数字。 - **操作符栈**:用于存储待处理的操作符。 - **优先级规则**:乘法和除法的优先级高于加法和减法,括号内的表达式优先计算。 - **空格处理**:忽略表达式中的空格字符。 通过上述方法,可以有效解决简单算术表达式求值问题,并且代码具有较高的可扩展性[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值