现在的位置: 首页 > 综合 > 正文

hdu1237 简单计算器

2018年04月23日 ⁄ 综合 ⁄ 共 1174字 ⁄ 字号 评论关闭

模拟栈运算,其实递归也可以,不过我够呛能写的出来

其实老早就看过表达式求值的问题,只不过一直没有敲过,今天敲了一下,发现还是有不少问题的

code:

#include <stack>
#include <cstdio>
#include <cstring>
using namespace std;
bool check(char,char);
void solve();
char str[205],ch;
double tmp,a,b;
int i,len;
stack<double> v;
stack<char> c;
int main()
{
    while(gets(str)!=NULL)
    {
        if(!strcmp(str,"0"))
        {
            break;
        }
        solve();
    }
    return 0;
}
void solve()
{
    len=strlen(str);
    for(i=0;i<len;i++)
    {
        if(str[i]==' ')
        {
            continue;
        }
        if(str[i]>='0' && str[i]<='9')
        {
            tmp=0;
            while(str[i]>='0' && str[i]<='9')
            {
                tmp*=10;
                tmp+=str[i]-'0';
                i++;
            }
            v.push(tmp);
        }
        if(str[i]=='+' || str[i]=='-' || str[i]=='*' || str[i]=='/')
        {
            if(c.empty())
            {
                c.push(str[i]);
            }else{
                ch=c.top();
                while(check(ch,str[i]))
                {
                    a=v.top();
                    v.pop();
                    b=v.top();
                    v.pop();

                    c.pop();

                    switch(ch)
                    {
                        case '+':
                            v.push(a+b);
                            break;
                        case '-':
                            v.push(b-a);
                            break;
                        case '*':
                            v.push(a*b);
                            break;
                        case '/':
                            v.push(b/a);
                            break;
                    }

                    if(c.empty())
                    {
                        break;
                    }else{
                        ch=c.top();
                    }
                }
                c.push(str[i]);
            }
        }
    }
    while(!c.empty())
    {
        a=v.top();
        v.pop();
        b=v.top();
        v.pop();

        ch=c.top();
        c.pop();

        switch(ch)
        {
            case '+':
                v.push(a+b);
                break;
            case '-':
                v.push(b-a);
                break;
            case '*':
                v.push(a*b);
                break;
            case '/':
                v.push(b/a);
                break;
        }
    }

    printf("%.2f\n",v.top());
    v.pop();
}
bool check(char ch1,char ch2)
{
    if(ch1=='*'||ch1=='/')
    {
        return true;
    }
    if(ch2=='+'||ch2=='-')
    {
        return true;
    }
    return false;
}

抱歉!评论已关闭.