【数据结构】P1981 表达式求值

题目描述

给定一个只包含加法和乘法的算术表达式,请你编程计算表达式的值。

输入格式

一行,为需要你计算的表达式,表达式中只包含数字、加法运算符“++”和乘法运算符“×”,且没有括号,所有参与运算的数字均为 0 到 2^{31}之间的整数。

输入数据保证这一行只有09、+、×这 1212种字符。

输出格式

一个整数,表示这个表达式的值。

注意:当答案长度多于 4 位时,请只输出最后4 位,前导0不输出。

输入输出样例

输入 #1
1+1*3+4
输出 #1
8
输入 #2
1+1234567890*1
输出 #2
7891
输入 #3
1+1000000003*1
输出 #3
4

 

 

【题解】

  经典问题,利用栈直接模拟即可,过程中需要取模运算即可。

 

 1 #include<algorithm>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<cstdio>
 5 #include<stack>
 6 using namespace std;
 7 const int N = 2e6+10;
 8 const int mod = 10000;
 9 char s[N];
10 stack <int> num ;
11 
12 int Mul(int u ,int v ){
13     return u * v % mod ;
14 }
15 int Add(int u ,int v ){
16     int res = u+v ;
17     if( res >= mod ) res -= mod ;
18     return res ;
19 }
20 void read(){
21     int len = strlen(s) , i=1 ;
22     int x = s[0] - '0' ;
23     bool mul = false ;
24     while( i < len ){
25         while( '0' <= s[i] && s[i] <= '9' ){
26             x = x * 10 + s[i] - '0' ;
27             i ++ ;
28         }
29         if( x >= 10000 ) x%=10000;
30         num.push(x);
31 
32         if( mul ){
33             int t1 = num.top() ;
34             num.pop();
35             int t2 = num.top() ;
36             num.pop();
37             x = Mul(t1,t2);
38             num.push(x);
39             mul = false;
40         }
41 
42         if( s[i] == '+' || s[i] =='*' ) {
43             mul = (s[i] =='*') ;
44         }
45         x = 0 ;
46         i++;
47     }
48     int ans = 0 ;
49     while( !num.empty() ){
50         ans = Add( (int)num.top() , ans );
51         num.pop() ;
52     }
53     printf("%d\n",ans);
54 }
55 int main()
56 {
57     scanf("%s",s);
58     //printf("%s\n",s);
59     read();
60     return 0;
61 }
View Code

 

posted @ 2019-08-26 08:30  Osea  阅读(250)  评论(0编辑  收藏  举报