Advertisement

上海计算机学会2021年12月月赛C++乙组T2逆波兰式

阅读量:

题目描述

逆波兰式即被称为后缀表达式...具体定义参见下文

单一数值如 6、8 等都属于后缀表达式;
如果 e_1e_2 是前缀运算符,则通过结合运算符 +-\ast 可以得到新的前缀运算符;
只有完全符合上述两条规则才能构成有效的前缀运算符。

给定一个后缀表达式(保证合法),请计算表达式的值,并输出它模 10 的余数。

特别说明:为了简便起见,在本表达式中我们跳过了所有的除法运算同时要求所有出现的数字均为个位数。

输入格式

定义为一个字符序列:用于表示输入的后缀表达式。各字符之间以空格分隔。规定输入仅允许出现 09 以及 +``-``* 运算符,并构成合法有效的后缀表达式

输出格式

单个数字:表示表达式的值模 10 的余数,注意余数必须大于或等于零。

数据范围

记输入的可见字符数量为 n,

  • 对于 50% 的数据,1≤n≤100;
  • 对于 100% 的数据,1≤n≤100,000。

样例数据

输入:
3 4 +
输出:
7
输入:
2 3 3 + *
输出:
12
说明:
2*(3+3)=12
输入:
1 2 * 3 + 4 * 5 - 6 + 7 * 8 - 9 +
输出:
8
输入:
1 5 -
输出:
6

解析:用栈解决

复制代码
 #include <bits/stdc++.h>

    
 using namespace std;
    
 int a[1000005];
    
  
    
 int main()
    
 {
    
     int p=0;
    
     char c;
    
     int t;
    
     while (cin>>c)
    
     {
    
     if (c>='0'&&c<='9')
    
     {
    
         p++;
    
         a[p]=c-'0';
    
     }else if (c=='+')
    
     {
    
         t=a[p];
    
         p--;
    
         a[p]+=t;
    
         a[p]%=10;
    
     }else if (c=='-')
    
     {
    
         t=a[p];
    
         p--;
    
         a[p]-=t;
    
         a[p]%=10;
    
     }else if (c=='*')
    
     {
    
         t=a[p];
    
         p--;
    
         a[p]*=t;
    
         a[p]%=10;
    
     }
    
     }
    
     if (a[p]<0) a[p]+=10;
    
     cout<<a[p]<<endl;
    
     return 0;
    
 }

全部评论 (0)

还没有任何评论哟~