题目描述
给定一个火星文字符串和一个运算表达式,其中火星文字符串中的每个字符代表一个数字(0-9),并且运算表达式中可能包含火星文字符。要求计算这个表达式的值。
输入
- 第一行为一个火星文字符串,字符串中的每个字符唯一对应一个0-9之间的数字。
- 第二行为一个运算表达式,包含基本的四则运算(加 +,减 -,乘 *,除 /),以及火星文字符。
输出
输出运算表达式的结果。
示例
输入
abc
a+b*c
输出
假设a=1, b=2, c=3,则表达式 a+b*c = 1+2*3 = 7
思路
- 映射关系建立 :首先建立一个火星文字符到数字的映射关系。
- 表达式解析 :遍历运算表达式,将火星文字符替换为对应的数字。
- 计算表达式 :使用栈或内置的计算器库计算替换后的表达式。
Java 编码解析
import java.util.*;
public class MarsCalculator {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 读取火星文字符串
String marsStr = scanner.nextLine();
// 建立火星文字符到数字的映射
Map<Character, Integer> map = new HashMap<>();
for (int i = 0; i < marsStr.length(); i++) {
char c = marsStr.charAt(i);
map.put(c, i);
}
// 读取运算表达式
String expression = scanner.nextLine();
// 替换火星文字符为数字
StringBuilder sb = new StringBuilder();
for (char c : expression.toCharArray()) {
if (map.containsKey(c)) {
sb.append(map.get(c));
} else {
sb.append(c);
}
}
// 计算表达式的值
try {
ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript");
Object result = engine.eval(sb.toString());
System.out.println(result);
} catch (Exception e) {
e.printStackTrace();
}
scanner.close();
}
}
C++ 编码解析
#include <iostream>
#include <unordered_map>
#include <stack>
#include <sstream>
#include <cctype>
#include <cmath>
using namespace std;
int evaluateExpression(const string& expression) {
stack<int> values;
stack<char> ops;
for (char ch : expression) {
if (isdigit(ch)) {
int val = 0;
while (isdigit(ch)) {
val = val * 10 + (ch - '0');
ch = next(expression.begin(), distance(expression.begin(), find(expression.begin(), expression.end(), ch)) + 1); // Move to next char (ugly way due to single char iteration)
}
--ch; // Correct the overshoot
values.push(val);
} else if (ch == '(') {
ops.push(ch);
} else if (ch == ')') {
while (!ops.empty() && ops.top() != '(') {
int val2 = values.top(); values.pop();
int val1 = values.top(); values.pop();
char op = ops.top(); ops.pop();
switch (op) {
case '+': values.push(val1 + val2); break;
case '-': values.push(val1 - val2); break;
case '*': values.push(val1 * val2); break;
case '/': values.push(val1 / val2); break;
}
}
ops.pop(); // Pop '('
} else if (ch == '+' || ch == '-' || ch == '*' || ch == '/') {
while (!ops.empty() && precedence(ops.top()) >= precedence(ch)) {
int val2 = values.top(); values.pop();
int val1 = values.top(); values.pop();
char op = ops.top(); ops.pop();
switch (op) {
case '+': values.push(val1 + val2); break;
case '-': values.push(val1 - val2); break;
case '*': values.push(val1 * val2); break;
case '/': values.push(val1 / val2); break;
}
}
ops.push(ch);
}
}
while (!ops.empty()) {
int val2 = values.top(); values.pop();
int val1 = values.top(); values.pop();
char op = ops.top(); ops.pop();
switch (op) {
case '+': values.push(val1 + val2); break;
case '-': values.push(val1 - val2); break;
case '*': values.push(val1 * val2); break;
case '/': values.push(val1 / val2); break;
}
}
return values.top();
}
int precedence(char op) {
if (op == '+' || op == '-') return 1;
if (op == '*' || op == '/') return 2;
return 0;
}
int main() {
string marsStr, expression;
getline(cin, marsStr);
getline(cin, expression);
unordered_map<char, int> map;
for (int i = 0; i < marsStr.size(); ++i) {
map[marsStr[i]] = i;
}
for (auto& ch : expression) {
if (map.find(ch) != map.end()) {
ch = '0' + map[ch];
}
}
cout << evaluateExpression(expression) << endl;
return 0;
}
Python 编码解析
def evaluate_expression(expression):
def precedence(op):
if op in ('+', '-'):
return 1
if op in ('*', '/'):
return 2
return 0
def apply_op(a, b, op):
if op == '+': return a + b
if op == '-': return a - b
if op == '*': return a * b
if op == '/': return a / b
values = []
ops = []
i = 0
while i < len(expression):
if expression[i].isdigit():
val = 0
while i < len(expression) and expression[i].isdigit():
val = val * 10 + int(expression[i])
i += 1
values.append(val)
i -= 1 # Correct the over-increment
elif expression[i] == '(':
ops.append(expression[i])
elif expression[i] == ')':
while ops and ops[-1] != '(':
val2 = values.pop()
val1 = values.pop()
op = ops.pop()
values.append(apply_op(val1, val2, op))
ops.pop() # Pop '('
elif expression[i] in ('+', '-', '*', '/'):
while ops and precedence(ops[-1]) >= precedence(expression[i]):
val2 = values.pop()
val1 = values.pop()
op = ops.pop()
values.append(apply_op(val1, val2, op))
ops.append(expression[i])
i += 1
while ops:
val2 = values.pop()
val1 = values.pop()
op = ops.pop()
values.append(apply_op(val1, val2, op))
return values[0]
if name == "main":
import sys
input = sys.stdin.read
data = input().split()
mars_str = data[0]
expression = data[1]
mapping = {c: i for i, c in enumerate(mars_str)}
for i, ch in enumerate(expression):
if ch in mapping:
expression = expression[:i] + str(mapping[