327 - Evaluating Simple C Expressions

news/2024/7/7 20:26:06

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

题意:
C 表达式运算, 变量为 a-z, 代表运算数为 1-26; 运算符包括 +, -, ++, --; 要求输出原表达式的运算结果, 及运算完后各个变量的值.
1. 每个变量只会出现一次;
2. 不会出现 a+++b 这样带歧义的表达式;
3. ++ 或 -- 不会既出现在变量前面, 又出现在后面.

思路:
1. 把空格去掉;

2. 把 ++ 与 -- 去掉, 把相应的变量按先缀/后缀计算完替换成数字; 
(1). 从字符串起始开始, 每次往后数2位, 看这三位是否满足 a++, a--, ++a, --a 这样的形式, 若满足, 则这是一个前缀/后缀表达式的变量;

3. 在进行 2 的时候, 把碰到的每个变量的值都记录下来(用 map), 如果有前缀/后缀运算, 就把运算完后变量的结果记录下来;

4. 每碰到一个运算符, 接下来一定是一个变量, 此时, 只需根据运算符 +, - , 把当前变量与前面的计算结果进行运算即可.

要点:
map 的 key 默认就是字典序的, 所以输出时, 直接用 iterator 进行 ++ 输出即可.

题目:
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=104&page=show_problem&problem=263

代码:

# include <iostream>
# include <string>
# include <cstdio>
# include <cstring>
# include <vector>
# include <algorithm>
# include <cctype>
# include <iterator>
# include <assert.h>
# include <map>
using namespace std;typedef map<char, int>::iterator MIT;// 本运算式中使用的变量
map<char, int> usedVariables;
map<char, int> variables;// 初始化 a-z 为 1-26
void initVariables(map<char, int>& variables) {for (int i=0; i<26; i++) {variables['a' + i] = i + 1;}
}// 去除空格
string removeSpace(const string& line) {string result;for (int i=0; i<line.size(); i++) {if (!isspace(line[i])) result += line[i];}return result;
}// 判断从 index 往后 3 位是否为 ++a 格式
bool isPrefixAdd(const string& expression, int index) {return expression[index] == '+' &&expression[index+1] == '+' && islower(expression[index+2]);
}// 判断从 index 往后 3 位是否为 --a 格式
bool isPrefixMinus(const string& expression, int index) {return expression[index] == '-' &&expression[index+1] == '-' && islower(expression[index+2]);
}// 判断从 index 往后 3 位是否为 a++ 格式
bool isPostfixAdd(const string& expression, int index) {return islower(expression[index]) &&expression[index+1] == '+' && expression[index+2] == '+';
}// 判断从 index 往后 3 位是否为 a-- 格式
bool isPostfixMinus(const string& expression, int index) {return islower(expression[index]) &&expression[index+1] == '-' && expression[index+2] == '-';
}// 获取 expression[index] 处的变量值, 若是正常变量, 则index 前进 1
// 若取到一个 ++ 或 -- , 则 index 前进 3
// 并把变量的值存放到 usedVariables 中
// 返回值: first 为变量值, second 为下一步操作的 index
pair<int, int> getVariable(const string& expression, int index) {int value;char c;if (isPrefixAdd(expression, index)) {              // ++aindex = index+2;c = expression[index];value = variables[c] + 1;usedVariables[c] = value;} else if (isPrefixMinus(expression, index)) {     // --aindex = index+2;c = expression[index];value = variables[c] - 1;usedVariables[c] = value;}else if (isPostfixAdd(expression, index)) {       // a++c = expression[index];index = index+2;value = variables[c];usedVariables[c] = value + 1;}else if (isPostfixMinus(expression, index)) {      // a--c = expression[index];index = index+2;value = variables[c];usedVariables[c] = value - 1;} else {                                            // aassert(islower(expression[index]));c = expression[index];value = variables[c];usedVariables[c] = value;}return make_pair(value, ++index);
}// 计算表达式
int calcExpression(const string& expression) {int i = 0;pair<int, int> variable;// 取第一个变量variable = getVariable(expression, i);int value = variable.first;i = variable.second;// 如果到结尾了, 说明这里只有一个变量if (i >= expression.size()) return value;while (i < expression.size()) {// 取运算符char op = expression[i];++i;// 取接下来的变量, 有运算符就必定有变量variable = getVariable(expression, i);int next = variable.first;i = variable.second;// 计算if (op == '+') {value += next;} else {          // op == '-'value -= next;}}return value;
}int main(int argc, char const *argv[])
{#ifndef ONLINE_JUDGEfreopen("327_i.txt", "r", stdin);  freopen("uva_o.txt", "w", stdout); #endifinitVariables(variables);string line;while (getline(cin, line)) {usedVariables.clear();string expression = removeSpace(line);int value = calcExpression(expression);// 输出printf("Expression: %s\n", line.c_str());printf("    value = %d\n", value);for (MIT it = usedVariables.begin(); it != usedVariables.end(); it++) {printf("    %c = %d\n", it->first, it->second);}}return 0;
}

环境:  C++ 4.5.3 - GNU C++ Compiler with options: -lm -lcrypt -O2 -pipe -DONLINE_JUDGE

转载于:https://my.oschina.net/zenglingfan/blog/151909


http://lihuaxi.xjx100.cn/news/290418.html

相关文章

UVA10003 切木棍 Cutting Sticks(区间DP、细节)

整理的算法模板合集&#xff1a; ACM模板 本题其实就是一个区间DP 的模板题&#xff0c;总长度为len&#xff0c;有n个切割点&#xff0c;也就是说能被切割成n1段&#xff0c;所以左边界是0&#xff0c;有边界是n 1&#xff0c;所以答案就是f[0][n 1]。 其中我们要把两个端点…

奇点汽车打算明年推L3自动驾驶,不用激光雷达

&#xfeff;&#xfeff;作者 | DavidZh出品 | AI科技大本营&#xff08;公众号ID&#xff1a;rgznai100&#xff09;今年 4 月北京车展期间&#xff0c;新造车公司之一的奇点汽车&#xff08;Singulato&#xff09;除了宣布奇点 iS6 将在今年年底开始量产&#xff0c;还请来了…

UVA1626 括号序列 Brackets sequence(区间DP匹配括号,输出匹配方案)

整理的算法模板合集&#xff1a; ACM模板 UVA1626 Brackets sequence 我们将正规括号序列定义如下&#xff1a; 空序列是正规括号序列。如果 SSS 是一个正规括号序列&#xff0c;那么 (S) 和 [S] 都是正规括号序列。如果 A 和 B 都是正规括号序列&#xff0c;那么 AB 是一个正…

Lync server 2010部署及解决方案

本文转自此出处http://jeffrey2013.blog.51cto.com/1649904/882363主要内容&#xff1a;1.LYNC2010服务器角色2.LYNC的部署架构3.LYNC部署的软硬件需求4.LYNC的安装部署为什么选择LYNC?LYNC的服务器角色&#xff1a;标准版&#xff1a;集成了ALL-IN-ONE的所有角色&#xff0c;…

今日宜募捐?刘强东、李彦宏清北壕捐大PK

整理 | Mavis出品 | AI科技大本营&#xff08;公众号ID&#xff1a;rgznai100&#xff09;清华北大两所名校自成立至今&#xff0c;已成为人们口中连在一起的词组。今天&#xff0c;两件大事又让这两所名校连在了一起&#xff01;▌第一件&#xff1a;李彦宏夫妇向北京大学捐赠…

luogu P3398 仓鼠找sugar(树链剖分、求树上两条路径有没有交点,爽!)

整理的算法模板合集&#xff1a; ACM模板 舒服&#xff0c;一次敲160行代码一次编译通过一次AC是真的爽&#xff01; 虽然这道题可以当作简单版的树链剖分板子题了hhh 要求的是两条路径有没有交点&#xff0c;正解是LCA玄学证明&#xff0c;看的我有点懵&#xff0c;但是这道…

Google创始人公开信:AI暖春和黑暗面

&#xfeff;整理 | Just出品 | AI科技大本营&#xff08;公众号ID&#xff1a;rgznai100&#xff09;自 2004 年以来&#xff0c;Google 创始人每年都要对外发布一份公开信&#xff0c;可以说这已经成了佩奇和布林两位创始人的一个传统节目。今年的公开信轮到了布林。在近日发…

[置顶] 使用 maven 插件 maven-shade-plugin 对可执行 java 工程及其全部依赖 jar 进行打包...

作者&#xff1a;chenzhou123520 出处&#xff1a;http://chenzhou123520.iteye.com/blog/1706242 使用 maven 插件 maven-shade-plugin 对 java 工程及其全部依赖 jar 进行打包 博客分类&#xff1a; Maven Javamaven-shade-pluginmaven-assembly-pluginmavenjar打包现在基本…