华为笔试题--表达式求值

题目描述

给定一个字符串描述的算术表达式,计算出结果值。

输入字符串长度不超过100,合法的字符包括”+, -, *, /, (, )”,”0-9”,字符串内容的合法性及表达式语法的合法性由做题者检查。本题目只涉及整型计算。

输入:

400+50/2-30*(3-6)

输出:

515

 1 #include <iostream>
 2 #include <string>
 3 #include <vector>
 4 #include <cstdlib>
 5 #include <cctype>
 6 #include <stack>
 7 #include <map>
 8 using namespace std;
 9 map<char, int> priority = {
10     { ‘+‘, 1 },{ ‘-‘, 1 },{ ‘*‘, 2 },{ ‘/‘, 2 },{ ‘(‘, 0 }
11 }; // 定义运算符优先级
12 vector<string> postExpression; //存放后缀表达式
13 stack<char> op; //存放计算后缀表达式是的辅助运算符栈
14
15 void convertToPostExpression(string& str)
16 {
17     string num;
18     for (int i = 0; i < str.size(); ++i) {
19         if (isdigit(str[i])) {
20             num.clear();
21             while (isdigit(str[i])) {
22                 num.push_back(str[i]);
23                 ++i;
24             }
25             postExpression.push_back(num);//是数字则直接push
26             --i;
27         }
28         else if (str[i] == ‘(‘) {
29             op.push(str[i]);
30         }
31         else if (str[i] == ‘)‘) {
32             while (op.top() != ‘(‘) {
33                 string tmp;
34                 tmp.push_back(op.top());
35                 postExpression.push_back(tmp);
36                 op.pop();
37             }
38             op.pop();  //将‘)‘也pop出来
39         }
40         else {
41             while (!op.empty() && priority[str[i]] <= priority[op.top()]) {
42                 string tmp;
43                 tmp.push_back(op.top());
44                 postExpression.push_back(tmp);
45                 op.pop();
46             }
47             op.push(str[i]);
48         }
49     }
50     while (!op.empty()) {  //遍历完字符串可能栈里还有运算符 一起弹出
51         string tmp;
52         tmp.push_back(op.top());
53         postExpression.push_back(tmp);
54         op.pop();
55     }
56 }
57
58 int calculateExpression(string& str)
59 {
60     stack<int> res;
61     convertToPostExpression(str);
62     /*for (int i = 0; i < postExpression.size(); ++i) {
63         cout << postExpression[i] << " ";
64     }
65     cout << endl;*/
66     for (int i = 0; i < postExpression.size(); ++i) {
67         if (isdigit(postExpression[i][0])) {
68             int num = atoi(postExpression[i].c_str());
69             res.push(num);
70         }
71         else {
72             int tmp1 = res.top();
73             res.pop();
74             int tmp2 = res.top();
75             res.pop();
76             switch (postExpression[i][0]) {
77             case ‘+‘: res.push(tmp1 + tmp2); break;
78             case ‘-‘: res.push(tmp2 - tmp1); break;
79             case ‘*‘: res.push(tmp2 * tmp1); break;
80             case ‘/‘: res.push(tmp2 / tmp1); break;
81             }
82         }
83     }
84     return res.top();
85 }
86
87 int main()
88 {
89     string str;
90     while (cin >> str) {
91         cout << calculateExpression(str) << endl;
92     }
93 }

原文地址:https://www.cnblogs.com/joker1937/p/10669949.html

时间: 2024-11-03 21:06:25

华为笔试题--表达式求值的相关文章

四则运算表达式求值 OpenJ_Bailian - 4132

四则运算表达式求值 OpenJ_Bailian - 4132 题意:设计一个计算器,实现+-*/以及()的表达式运算求值. 栈的应用,这学期学数据结构,手写了栈练一下~ 1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxn=10010; //最大表达式长度 4 5 template <typename T> 6 class Stack; 7 8 template <typename T> 9

表达式求值

表达式求值 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描写叙述 Dr.Kong设计的机器人卡多掌握了加减法运算以后,近期又学会了一些简单的函数求值,比方,它知道函数min(20,23)的值是20 ,add(10,98) 的值是108等等.经过训练,Dr.Kong设计的机器人卡多甚至会计算一种嵌套的更复杂的表达式. 如果表达式能够简单定义为: 1. 一个正的十进制数 x 是一个表达式. 2. 假设 x 和 y 是 表达式,则 函数min(x,y )也是表达式,其值为x

数据结构算法C语言实现(八)--- 3.2栈的应用举例:迷宫求解与表达式求值

一.简介 迷宫求解:类似图的DFS.具体的算法思路可以参考书上的50.51页,不过书上只说了粗略的算法,实现起来还是有很多细节需要注意.大多数只是给了个抽象的名字,甚至参数类型,返回值也没说的很清楚,所以很多需要自己揣摩.这也体现了算法和程序设计语言的特点,算法更侧重本质的描述,而任何编程语言都要照顾到实现的细节以及数据类型等语法方面的需求. 表达式求值: [编码中....] 二.头文件 迷宫求解: 1 //3_2_maze.h 2 /** 3 author:zhaoyu 4 email:[em

四则运算表达式求值の各种心碎

实验三---四则运算表达式求值 一.基本要求: ( 1 ) 利用二叉树后序遍历来实现表达式的转换,同时可以使用实验三的结果来求解后缀表达式的值. ( 2) 输入输出格式: 输入格式:在字符界面上输入一个中缀表达式,回车表示结束. 请输入表达式: 输入一个中缀表达式 输出格式:如果该中缀表达式正确,那么在字符界面上输出其后缀表达式,其中后 缀表达式中两相邻操作数之间利用空格隔开:如果不正确,在字符界面上输出表达式错误提示. 逆波兰表达式为: 输出逆波兰表达式 运算结果为:输出运算后的结果 测试数据

【蓝桥杯】历届试题 公式求值

  历届试题 公式求值   时间限制:1.0s   内存限制:256.0MB 问题描述 输入n, m, k,输出下面公式的值. 其中C_n^m是组合数,表示在n个人的集合中选出m个人组成一个集合的方案数.组合数的计算公式如下. 输入格式 输入的第一行包含一个整数n:第二行包含一个整数m,第三行包含一个整数k. 输出格式 计算上面公式的值,由于答案非常大,请输出这个值除以999101的余数. 样例输入 313 样例输出 162 样例输入 201010 样例输出 359316 数据规模和约定 对于1

lintcode 中等题:Evaluate Reverse Polish notation逆波兰表达式求值

题目 逆波兰表达式求值 在逆波兰表达法中,其有效的运算符号包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰计数表达. 样例 ["2", "1", "+", "3", "*"] -> ((2 + 1) * 3) -> 9 ["4", "13", "5", "/", "+"]

使用逆波兰式进行表达式求值

中缀表达式及后缀表达式图解中说明了使用逆波兰式进行表达式求值的方法,这里使用C++进行实现.实现和原理讲解有一点不同,需要进一步进行细化. 关于将中缀表达式转换成后后缀表达式的规则: 规则:从左到右遍历中缀表达式的每个数字和符号,若是数字就输出,即成为后缀表达式的一部分:若是符号,则判断其与栈顶符号的优先级,是右括号或优先级低于找顶符号(乘除优先加减)则栈顶元素依次出找并输出,并将当前符号进栈,一直到最终输出后缀表达式为止. 上面的规则转换成下面的执行规则: 1.遇到操作数:直接输出(添加到后缀

序列点在C语言表达式求值中的作用

摘要: 本文开创性地分析了序列点在C语言表达式求值中的作用:序列点左边的操作数要先于其右边的操作数求值.讨论了逗号操作符,.逻辑与操作符&&.逻辑或操作符||和条件操作符?:的问号处需要序列点的原因.举例分析了序列点在表达式求值中的作用. 关键字:序列点 表达式求值 C语言 C语言作为一种主流程序设计语言,许多编程语言如Java.C++.C#都借鉴了它的语法.C语言也是一种很适当的程序设计入门的教学语言,国内大专院校的许多专业都开设了这门课程并且大多将其作为第一门程序设计语言课程,同时C语

蓝桥杯-历届试题-公式求值

历届试题 公式求值 时间限制:1.0s   内存限制:256.0MB 问题描述 输入n, m, k,输出下面公式的值. 其中C_n^m是组合数,表示在n个人的集合中选出m个人组成一个集合的方案数.组合数的计算公式如下. 输入格式 输入的第一行包含一个整数n:第二行包含一个整数m,第三行包含一个整数k. 输出格式 计算上面公式的值,由于答案非常大,请输出这个值除以999101的余数. 样例输入 313 样例输出 162 样例输入 201010 样例输出 359316 数据规模和约定 对于10%的数