`
844604778
  • 浏览: 548583 次
文章分类
社区版块
存档分类
最新评论

HDOJ,杭电1237简单计算器。。。数据结构小练习。

 
阅读更多
Problem Description
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。

Input
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。

Output
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。

Sample Input
1 + 2 4 + 2 * 5 - 7 / 11 0

Sample Output
3.00 13.36
代码:
//http://acm.hdu.edu.cn/showproblem.php?pid=1237
#include<iostream>
#include<string>
#include<cstring>
#include<cstdio>
#include<stack>
using namespace std;

stack<int>num;
stack<char>fu;

double sum_num(double x,char a)//递归
{
     if(fu.empty())//递归结束条件
     {
          switch(a)
          {
               case '*': return x*num.top();break;
               case '/': return x/num.top();break;
               case '+': return x+num.top();break;
               case '-': return x-num.top();break;
          }
     }

     switch(a)
     {
     case '+':
          {
               if(fu.top()=='*' || fu.top()=='/')//考虑下一个符号
               {
                    double y=num.top();
                    num.pop();
                    char b=fu.top();
                    fu.pop();
                    return x+sum_num(y,b);
               }
               else
               {
                    x+=num.top();
                    num.pop();
                    a=fu.top();
                    fu.pop();
                    return sum_num(x,a);
               }
               break;
          }
     case '-':
          {
               if(fu.top()=='*' || fu.top()=='/')//考虑下一个符号
               {
                    double y=num.top();
                    num.pop();
                    char b=fu.top();
                    fu.pop();
                    return x+sum_num(-y,b);//注意:千万不能写成x-sum_num(y,b)
               }
               else
               {
                    x-=num.top();
                    num.pop();
                    a=fu.top();
                    fu.pop();
                    return sum_num(x,a);
               }
               break;
          }
     case '*':
          {
               x*=num.top();
               num.pop();
               a=fu.top();
               fu.pop();
               return sum_num(x,a);
               break;
          }
     case '/':
          {
               x/=num.top();
               num.pop();
               a=fu.top();
               fu.pop();
               return sum_num(x,a);
               break;
          }
     }
}

int main()
{
    string f;
    while(getline(cin,f))
    {
        if(f=="0")
          break;
        int len=f.size();
        while(!num.empty())           //初始化以及清空栈
            num.pop();
        while(!fu.empty())            //初始化以及清空栈
            fu.pop();
        int x=0,p=1,j=0, i;              //p用来判断一个数字是在这个数的个位十位还是其它,p就是相应10的几次方
        for( i=len-1; i>=0; i--)   //找到字串中的数
        {
            if(f[i]>='0' && f[i]<='9')
            {
                 if(i<len-1 && (f[i+1]<'0'||f[i]>'9') )
                 {
                      num.push(x);   //数入栈
                      x=0;
                      p=1;
                 }
                 if(i==0)
                 {
                      x=x+(f[i]-'0')*p;
                      num.push(x);    //数入栈
                 }
                 x=x+p*(f[i]-'0');
                 p*=10;
            }
            else if(f[i]=='+' || f[i]=='-' || f[i]=='/' || f[i]=='*')
            {
                 fu.push(f[i]);      //符号入栈
            }
        }
        double n=(double)num.top();
        num.pop();
        char a=fu.top();
        fu.pop();
        double sum=sum_num(n,a);
        //cout<<sum<<endl;
        printf("%.2lf\n",sum);
    }
    return 0;
}


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics