zoukankan      html  css  js  c++  java
  • hdu 1296

    原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1296

    题意:多项式求值;

    思路:很水的一道题(方法有多种),这里用表达式求值(转化成后缀表达式)的方式

       不知到这个方法的朋友可以看看大神的:http://blog.csdn.net/sr_19930829/article/details/50809712

       可以帮助大家理解;

    反省:这个题的数据可以说很坑人:-X,+X,0X(是数字零不是字母o)一直RE就是死在这三个数据上了

    代码:

      1 #include<stack>
      2 #include<iostream>
      3 #include<string>
      4 #include<cstdio>
      5 
      6 using namespace std;
      7 
      8 struct Pri{
      9     char op;
     10     int pri;
     11 }lpri[4]={{'+',2},{'-',2},{'*',4},{'^',6}},
     12  rpri[4]={{'+',1},{'-',1},{'*',3},{'^',5}};
     13  
     14 int find_leftPri(char op)
     15 {
     16     for(int i=0;i<4;i++)
     17         if(op==lpri[i].op)
     18             return lpri[i].pri;
     19 }
     20 
     21 int find_rightPri(char op)
     22 {
     23     for(int i=0;i<4;i++)
     24         if(op==rpri[i].op)
     25             return rpri[i].pri;
     26 }
     27 
     28 int Precede(char op1,char op2)
     29 {
     30     int L=find_leftPri(op1);
     31     int R=find_rightPri(op2);
     32     if(L==R)
     33         return 0;
     34     if(L>R)
     35         return 1;
     36     return -1;
     37 }
     38 
     39 long long pow(int x,int n)
     40 {
     41     long long ans=1;
     42     while(n--)
     43         ans*=x;
     44     return ans;
     45 }
     46 
     47 long long Run(stack<long long>& num,char op)
     48 {
     49     long long a=num.top();
     50     num.pop();
     51     long long b=num.top();
     52 //    cout<<"a="<<a<<" b="<<b<<" op is "<<op<<endl;
     53     num.pop();
     54     switch(op)
     55     {
     56         case '+':
     57             return b+a;
     58         case '-':
     59             return b-a;
     60         case '*':
     61             return b*a;
     62         case '^':
     63             return pow(b,a);
     64     }
     65 }
     66 
     67 int main()
     68 {
     69     string s;
     70     int x;
     71     while(scanf("%d",&x)!=EOF)
     72     {
     73         stack<char>op;
     74         stack<long long>num;
     75         int i,j;
     76         cin>>s;
     77         for(i=0;i<s.length();i++)
     78         {
     79         //    cout<<"i="<<i<<endl;
     80             if(s[i]>='0'&&s[i]<='9')
     81             {
     82                 int t=0;
     83                 for(j=i;s[j]>='0'&&s[j]<='9';j++)
     84                     t=t*10+(s[j]-'0');
     85                 num.push(t);
     86                 i=j-1;
     87             //    cout<<"@@t="<<t<<" i="<<i<<" j="<<j<<endl;
     88             }
     89             else if(s[i]=='X')
     90             {
     91                 int t=0;
     92                 if((s[i-1]=='-'||s[i-1]=='+')&&i!=0)
     93                     num.push(1);
     94                 if(!num.empty())
     95                     op.push('*');
     96                 num.push(x);
     97             }
     98             else
     99             {
    100                 if((s[i]=='-'||s[i]=='+')&&num.empty())
    101                 {
    102                 //    cout<<"......-x......."<<endl;
    103                         num.push(0);
    104                 }
    105                 if(op.empty())
    106                     op.push(s[i]);
    107                 else
    108                 {
    109                     int judg=Precede(op.top(),s[i]);
    110                     switch(judg)
    111                     {
    112                         long long t;
    113                         case 1:
    114                             t=Run(num,op.top());
    115                             num.push(t);
    116                     //        cout<<"Run(num,op.top())="<<t<<endl;
    117                             op.pop();
    118                             i--;break;
    119                         case -1:
    120                             if((s[i]=='-'||s[i]=='+')&&s[i+1]=='X')
    121                                 num.push(1);
    122                             op.push(s[i]);break;        
    123                     }
    124                 }    
    125             }
    126         }
    127         while(!op.empty())
    128         {
    129             num.push(Run(num,op.top()));
    130             op.pop();
    131         }
    132         cout<<num.top()<<endl;
    133     }
    134     
    135     return 0;
    136 }

    ---------------欢迎评论指导---------------

  • 相关阅读:
    MVC-07数据库
    Visual Web Developer 2012安裝教程
    开机启动项
    使用其他身份运行计算机(DOS命令)
    网络重置
    JavaWeb(七):EL表达式、自定义标签和JSTL
    JavaWeb(六):会话与状态管理
    JavaWeb(五):MVC案例
    JavaWeb(三):JSP
    JavaWeb(二):Servlet
  • 原文地址:https://www.cnblogs.com/x-x-y/p/7467604.html
Copyright © 2011-2022 走看看