zoukankan      html  css  js  c++  java
  • poj1686 Lazy Math Instructor

     1 #include<map>
     2 #include<stack>
     3 #include<cctype>
     4 #include<iostream>
     5 using namespace std;
     6 map<char,int> m;  //从字符映射到数字 
     7 string s1,s2,r1,r2;
     8 string transform(string s)//把表达式转化为后缀表达式方便计算 
     9 {
    10     int i,j,len;
    11     char c[81];
    12     stack<char> exp;  //定义一个字符栈,存放运算符 
    13     len=s.length();
    14     for(i=j=0;i<=len;++i){
    15         if(isalnum(s[i])) c[j++]=s[i];  //如果是操作数直接到数组 
    16         else{
    17             switch(s[i]){
    18                 case '(':
    19                     exp.push(s[i]);
    20                     break;
    21                 case ')':
    22                     while(exp.top()!='(')//碰到右括号,输出与前面左括号之间的所有
    23                     {                    //字符,无需 !exp.empty(),因为括号成对 
    24                         c[j++]=exp.top();
    25                         exp.pop();
    26                     }
    27                     exp.pop();  //左括号出栈 
    28                     break;
    29                 case '+':
    30                 case '-':
    31                 case '*':
    32                     while(!exp.empty()&&m[s[i]]<=m[exp.top()]){
    33                         c[j++]=exp.top();  //优先级大的出栈 
    34                         exp.pop();
    35                     }
    36                     exp.push(s[i]);//把当前运算符入栈 
    37             }
    38         }
    39     }
    40     while(!exp.empty()){  //输出剩余的运算符,'!'忘写了纠结半天 
    41         c[j++]=exp.top();
    42         exp.pop();
    43     }
    44     c[j]='\0';
    45     string temp=c;  //需转化为string型 
    46     return temp;            
    47 }
    48 int calculate(string r)//计算后缀表达式的值,字母用其ASC代替 
    49 {
    50     int i,len,a,b;
    51     stack<int> cal;
    52     len=r.length();
    53     for(i=0;i<len;++i){
    54         if(isalnum(r[i])) {
    55             if(isdigit(r[i])) cal.push(r[i]-'0');
    56             else cal.push(r[i]);
    57         }
    58         else{//碰到运算符,出栈两个数,运算结果再入栈 
    59             a=cal.top(); 
    60             cal.pop();
    61             b=cal.top();
    62             cal.pop();
    63             switch(r[i]){
    64                 case '+':
    65                     cal.push(b+a);
    66                     break;
    67                 case '-':
    68                     cal.push(b-a);
    69                     break;
    70                 case '*':
    71                     cal.push(b*a);
    72             }
    73         }
    74     }
    75     return cal.top(); //栈顶元素就是最终的计算结果 
    76 }
    77 int main()
    78 {
    79     int T;
    80     m['(']=0;
    81     m['+']=m['-']=1;
    82     m['*']=2;
    83     cin>>T;
    84     cin.get();//跳过一个回车 
    85     while(T--){
    86         getline(cin,s1);
    87         getline(cin,s2);
    88         r1=transform(s1);
    89         r2=transform(s2);
    90         if(calculate(r1)==calculate(r2)) cout<<"YES\n";
    91         else cout<<"NO\n";
    92     }
    93     return 0;
    94 }

    这个题一开始看到,是比较两个带参的表达式是否相等,不知所措,最后在网上看了别人的代码,才知道需要把里字母换成具体的数字才行,看到别人用的都是系统带的栈,我也用了一下,从中学到不少东西!也发现自己需要学习的还很多很多,加油!!!

     
  • 相关阅读:
    http返回码
    JAVA获取当前系统时间System.currentTimeMillis()以及获取运行时间
    【Jsoup】Jsoup解析Html标签(Java后台解析)
    字节、字、位、比特,这四者之间的关系
    Java中字符编码和字符串所占字节数 .
    判断一个字符串是否为全英文的工具
    汉语转拼音(全转与只转首个字母)工具类
    Page的生命周期及相关事件苛
    PHP设计模式——策略模式
    java生产者消费者问题代码分析
  • 原文地址:https://www.cnblogs.com/shihuajie/p/2627325.html
Copyright © 2011-2022 走看看