您的位置:首页 > 其它

hdu 1237 简单计算器

2012-11-01 17:15 246 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1237

#include<stdio.h>
#include<string.h>
#include<stack>
#include<algorithm>
using namespace std;
char s[300],suffix[1000];
int Priority(char ch)//各个符号的优先级
{
    switch(ch)
    {
        case '#':return 0;
        case '+':return 1;
        case '-':return 1;
        case '*':return 2;
        case '/':return 2;
    }
    return -1;
}
int is_number(char ch)//是不是数字
{
    if(ch>='0'&&ch<='9')
       return 1;
    return 0;
}
void Transform(char *suffix,char *s)//转换成后缀式
{
    stack<char>op;
    int l=strlen(s),i,k=0;
    op.push('#');
    for(i=0;i<l;i++)
    {
        if(is_number(s[i])||s[i]==' ')
             suffix[k++]=s[i];
        else
        {
            while(!op.empty()&&Priority(op.top())>=Priority(s[i]))//将stack中的所有的优先级不小于当前操作符的优先级的操作符发送给后缀式
            {
                suffix[k++]=op.top();
               // printf("%c\n",op.top());
                op.pop();
            }
            if(s[i]!='#')  op.push(s[i]);
        }
    }
    suffix[k]='\0';
}
void Calculate()
{
    stack<double>ans;
    int i=0,l=strlen(suffix);
    while(i<l)
    {
        if(suffix[i]==' ')
        {
            i++;continue;
        }
        if(suffix[i]=='#')  break;
        else
        {
            double a=0;
            int flag=0;
            while(is_number(suffix[i]))
            {
                a*=10;
                a+=(suffix[i++]-'0');
                flag=1;
            }
            if(flag)
            ans.push(a);
            if(suffix[i]==' ')  {i++;continue;}//不要写成if(suffix[i++]=' ')
            if(Priority(suffix[i])>0)
            {
                double num1,num2,num3;
                num1=ans.top();
                ans.pop();//注意弹出。
                num2=ans.top();
                ans.pop();
                switch(suffix[i++])
                {
                    case '+':num3=num2+num1;break;
                    case '-':num3=num2-num1;break;
                    case '*':num3=num2*num1;break;
                    case '/':num3=num2/num1;break;
                }
                ans.push(num3);
            }
        }
    }
    printf("%.2lf\n",ans.top());
}
int main()
{
    while(gets(s))//注意用gets,因为有空格,不要用scanf
    {
        memset(suffix,NULL,sizeof(suffix));
        int l=strlen(s);
        if(l==1&&s[0]=='0')
        break;
        else
        {
            s[l]='#';//加个#,作为结束标志
            Transform(suffix,s);
           //printf("%s\n",suffix);
           Calculate();
        }
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: