题目描述
【题目描述】
给定一个只包含加法和乘法的算术表达式,请你编程计算表达式的值。
【输入格式】
输入仅有一行,为需要你计算的表达式,表达式中只包含数字、加法运算符“+”和乘法运算符“”,且没有括号,所有参与运算的数字均为0到2^31-1之间的整数。输入数据保证这一行只有0~9、+、这12种字符。
【输出格式】
输出只有一行,包含一个整数,表示这个表达式的值。注意:当答案长度多于4位时,请只输出最后4位,前导0不输出。
【样例输入1】
1+1*3+4
【样例输出1】
8
【样例输入2】
1+1234567890*1
【样例输出2】
7891
【样例输入3】
1+1000000003*1
【样例输出3】
4
【样例解释】
样例1计算的结果为8,直接输出8。
样例2计算的结果为1234567891,输出后4位,即7891。
样例3计算的结果为1000000004,输出后4位,即4。
【数据规模】
对于30%的数据,0≤表达式中加法运算符和乘法运算符的总数≤100;
对于80%的数据,0≤表达式中加法运算符和乘法运算符的总数≤1000;
对于100%的数据,0≤表达式中加法运算符和乘法运算符的总数≤100000。
思路
建立两个栈,一个存放操作数,一个存放操作符,遇到操作数全部入栈,遇到操作符,判断优先级,如果栈顶操作符的优先级大于当前操作符的优先级,则操作数栈弹出两个操作数,操作符栈弹出一个操作符,进行运算,运算结果放入操作数栈中,如果栈顶操作符的优先级小于当前操作符的优先级,则继续入栈。可以在表达式的前后加上两个‘#’号,在前后两个‘#’号相遇时,循环结束。
代码一
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
   | 
 
 
  #include <iostream> #include <stack> #include <cctype> #include <cstdio>
  using namespace std;
  int main() {     freopen("expr2013.in", "r", stdin);     freopen("expr2013.out", "w", stdout);     string s;     stack<long long> S;     stack<char> SS;     cin >> s;     int i = 0;     long long num = 0;     while(i < s.size()) {         if(isdigit(s[i])) {             num = num * 10 + s[i++] - '0';         }         else {             S.push(num);             num = 0;             if(SS.empty()) {                 SS.push(s[i++]);             } else {                 if(SS.top() == '+' && s[i] == '*') {                     SS.push(s[i++]);                 } else {                     int a = S.top();                     S.pop();                     int b = S.top();                     S.pop();                     char op = SS.top();                     SS.pop();                     SS.push(s[i++]);                     long long res = (op == '+') ? (a + b) : (a * b);                     S.push(res % 10000);                 }             }         }     }     S.push(num);     while(!SS.empty()) {         int a = S.top();         S.pop();         int b = S.top();         S.pop();         char op = SS.top();         SS.pop();         long long res = (op == '+') ? (a + b) : (a * b);         S.push(res % 10000);     }
      cout << S.top() % 10000 << endl; }
 
  | 
 
代码二
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
   | 
 
 
  #include <iostream> #include <stack> #include <cstdio> using namespace std;
  int main() {     freopen("expr2013.in", "r", stdin);     freopen("expr2013.out", "w", stdout);     string s;     stack<int> opnd;     stack<char> optr;     optr.push('#');     cin >> s;     s.append(1, '#');     int i = 0;     int num = 0;     while(i < s.size() || optr.top() != '#') {         if(isdigit(s[i])) {             num = num * 10 + s[i++] - '0';         } else {             opnd.push(num % 10000);             num = 0;             if(optr.size() < 2 || (optr.top() == '+' && s[i] == '*')) {                 optr.push(s[i++]);             } else {                 int a = opnd.top();                 opnd.pop();                 int b = opnd.top();                 opnd.pop();                 char op = optr.top();                 optr.pop();                 num = (op == '+') ? (a + b) : (a * b);             }         }     }     cout << opnd.top() << endl; }
 
  |