zoukankan      html  css  js  c++  java
  • 华为笔试题--表达式求值

    题目描述

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

    输入字符串长度不超过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 }
  • 相关阅读:
    LeetCode——Generate Parentheses
    LeetCode——Best Time to Buy and Sell Stock IV
    LeetCode——Best Time to Buy and Sell Stock III
    LeetCode——Best Time to Buy and Sell Stock
    LeetCode——Find Minimum in Rotated Sorted Array
    Mahout实现基于用户的协同过滤算法
    使用Java对文件进行解压缩
    LeetCode——Convert Sorted Array to Binary Search Tree
    LeetCode——Missing Number
    LeetCode——Integer to Roman
  • 原文地址:https://www.cnblogs.com/joker1937/p/10669949.html
Copyright © 2011-2022 走看看