Yui的狗窝
Yui的狗窝
hihocoder 1332 简单计算器 栈应用

原题:https://hihocoder.com/problemset/problem/1332
这道题的思路应该很容易就想到了,用栈来读取表达式。当碰到括号我们分解问题,先求括号内表达式的值。
具体的代码实现感觉还是有点麻烦。

#include<cstring>
#include<cstdio>
#include<stack>
using namespace std;
char str[101];
int len,newstart;
int sol(int start)
{
    stack<int> s1;
    stack<char> s2;
    int left,right,tem=0,i=start;
    char c;
    for(;i<len;i++)
    {
        if(str[i]>='0'&&str[i]<='9')
        {
            tem=0;
            while(str[i]>='0'&&str[i]<='9')
            {
                tem=tem*10+str[i]-'0';
                i++;
            }
            s1.push(tem);
        }
        if(str[i]=='+'||str[i]=='-')
        {
            if(!s2.empty())
            {
                right=s1.top();
                s1.pop();
                left=s1.top();
                s1.pop();
                c=s2.top();
                s2.pop();
                if(c=='+')
                    tem=left+right;
                else if(c=='-')
                    tem=left-right;
                s1.push(tem);
                s2.push(str[i]);
            }
            else
                s2.push(str[i]);
        }
        else if(str[i]=='*')
        {
            i++;tem=0;
            if(str[i]=='(')
            {
                tem=sol(++i);
                i=newstart;
            }
            else
            {
                while(str[i]>='0'&&str[i]<='9')
                {
                    tem=tem*10+str[i]-'0';
                    i++;
                    if(i>len)
                        break;
                }
                i--;
            }
            left=s1.top();
            s1.pop();
            right=tem;
            tem=left*right;
            s1.push(tem);
        }
        else if(str[i]=='/')
        {
            i++;tem=0;
            if(str[i]=='(')
            {
                tem=sol(++i);
                i=newstart;
            }
            else
            {
                while(str[i]>='0'&&str[i]<='9')
                {
                    tem=tem*10+str[i]-'0';
                    i++;
                    if(i>len)
                        break;
                }
                i--;
            }
            left=s1.top();
            s1.pop();
            right=tem;
            tem=left/right;
            s1.push(tem);
        }
        else if(str[i]=='('||str[i]==')')
        {
            if(str[i]=='(')
            {
                tem=sol(++i);
                s1.push(tem);
            }
            else
            {
                if(!s2.empty())
                {
                    right=s1.top();
                    s1.pop();
                    left=s1.top();
                    s1.pop();
                    c=s2.top();
                    s2.pop();
                    if(c=='+')
                        tem=left+right;
                    else if(c=='-')
                        tem=left-right;
                    s1.push(tem);
                }
                newstart=i;
                return s1.top();
            }
            i=newstart;
        }
    }
    if(!s2.empty())
    {
        right=s1.top();
        s1.pop();
        left=s1.top();
        s1.pop();
        c=s2.top();
        s2.pop();
        if(c=='+')
            tem=left+right;
        else if(c=='-')
            tem=left-right;
        s1.push(tem);
    }
    return s1.top();
}
int main()
{
    gets(str);
    len=strlen(str);
    printf("%d\n",sol(0));
}
没有标签
首页      算法训练      hihocoder 1332 简单计算器 栈应用
https://secure.gravatar.com/avatar/d0fe7f1b17d5e9122db921e3a8cc327f?s=256&d=mm&r=g

Suzumiya, Yui

文章作者

发表评论

textsms
account_circle
email

Yui的狗窝

hihocoder 1332 简单计算器 栈应用
原题:https://hihocoder.com/problemset/problem/1332 这道题的思路应该很容易就想到了,用栈来读取表达式。当碰到括号我们分解问题,先求括号内表达式的值。 具体的代码实现感觉还是有点…
扫描二维码继续阅读
2017-10-31


没有激活的小工具