条件表达式求值

a?b:c运算符号是一个三元运算符号,其语法组成部分如下: test ? statement1 : statement2
部分描述
Test任何表达式,只包含问号(“?”),冒号(“:”)和数字。
statement1test非0 时执行的语句。
statement2test0 时执行的语句。
表达式的值为最后结果。此外,三元运算符号是右结合的。

数据输入输出

本题有多组输入数据,你必须处理到EOF为止。
每组数据给定一个三元运算符表达式(长度不超过200位),表达式中数字的取值范围是-2 31~2 31
例如,三元运算符表达式 0?2?3:4:5。先计算出 2?3:4的结果是 3, 将表达式化简为 0?3:5,再次计算,即可得表达式最终结果为 5。 输入数据中的表达式保证一定合法。

输入样例

1?2:3?4:5

输出样例

2

  
  
  1. //条件表达式求值   
  2. #include<iostream>   
  3. #include<stack>   
  4. #include<vector>   
  5. #include<stdio.h>   
  6. #include<string>   
  7. using namespace std;   
  8.   
  9. int main()   
  10. {   
  11.     string str;   
  12.     int i;long int a,b,c;   
  13.     cin>>str;   
  14.     while(!cin.eof())   
  15.     {   
  16.         stack<long int> L;   
  17.         for(i=str.size()-1;i>=0;i--)   
  18.         {   
  19.             a=0;   
  20.             int flag=0;   
  21.             string s;   
  22.             while(str[i]>='0'&&str[i]<='9')   
  23.             {   
  24.                 flag=1;   
  25.                 s+=str[i];   
  26.                 --i;   
  27.             }   
  28.             if(flag==1)   
  29.             {   
  30.                 for(int j=s.size()-1;j>=0;j--)//转换成正确的值,否则a将是逆值,如:24会变成42   
  31.                     a=a*10+s[j]-48;           //因为这边是逆序扫描   
  32.                 L.push(a);   
  33.                 flag=0;   
  34.             }   
  35.             while(str[i]=='?')   
  36.             {   
  37.                 --i;   
  38.                 if(i<0)   
  39.                     break;   
  40.                 b=0;   
  41.                 while(str[i]>='0'&&str[i]<='9')   
  42.                 {   
  43.                     b=b*10+str[i]-48;   
  44.                     --i;   
  45.                 }   
  46.                 if(b)//b非零时   
  47.                 {   
  48.                     c=L.top();   
  49.                     L.pop();   
  50.                     L.pop();   
  51.                     L.push(c);   
  52.                 }   
  53.                 else  
  54.                     L.pop();   
  55.             }   
  56.             if(i<0)   
  57.                 break;   
  58.         }   
  59.         cout<<L.top()<<endl;   
  60.         L.pop();//清栈   
  61.         cin>>str;   
  62.     }   
  63.     return 0;   
  64. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值