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

poj 1686

2017年11月23日 ⁄ 综合 ⁄ 共 1470字 ⁄ 字号 评论关闭

这个题真是简直了。。。。。

不得不说java智能了。。恩

#include <cstdio>
#include <cstring>
#include <stack>
#include <stdlib.h>
#include<ctype.h>
using namespace std;
const int maxn=int (1e5)+5;
stack <int> num;
stack <char> op;
int priv[127],val[27];

void init()
{
    while(!num.empty())
      num.pop();
    priv['+']=priv['-']=3;
    priv['*']=priv['/']=2;

    priv['(']=10;//特殊处理
}
int calc(int a,int b,char op)
{
    if(op=='+')
        return a+b;
    if(op=='-')
        return a-b;
    if(op=='*')
        return a*b;

}
void calc()
{
    int y=num.top();
    num.pop();
    int x=num.top();
    num.pop();
    char tmpop=op.top();
    op.pop();
    num.push(calc(x,y,tmpop));
}
int calc(char *str)
{
    init();
    int x,y,i,n=strlen(str);
    char tmpop,last=0;
    for(i=0;i<n;i++)
    {
        if(isalpha(str[i]))
            num.push(str[i]);
        else
            if(isdigit(str[i]))
        {
            num.push(atoi(str+i));
            for(;i+1<n&&isdigit(str[i+1]);++i);
        }
        else
            if(str[i]=='(')
               op.push('(');
        else
            if(str[i]==')')
        {
            while(op.top()!='(')
                calc();
            op.pop();
        }
        else
            if(str[i]=='-'&&(last==0||last=='('))
        {
            num.push(0);
            op.push('-');
        }
        else
            if(priv[str[i]])
        {
            while(!op.empty()&&priv[op.top()]<=priv[str[i]])
                calc();
            op.push(str[i]);
        }
        else continue;
        last=str[i];
    }
    while(!op.empty())
        calc();
    return num.top();
}
char s[85],s2[85];
bool ok()
{
   gets(s);
   gets(s2);
   return calc(s)==calc(s2);
}
int main()
{
    int t;
    scanf("%d",&t);
    getchar();
    while(t--)
    {
        if(ok())
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}

没有听到程学长讲题,理解这个题还是有了一点困难【因为比较繁琐

几乎是比着程学长的代码敲的啊喂才明白这个题的。。。智商确实拙计。可爱的程学长的博客如下啦:

http://endless.logdown.com/posts/2014/05/15/poj-1686-lazy-math-instructor-in-java-scriptengine-usage

大体思路就是用两个栈存数和运算符,-号时存储数的栈push一个0。如果运算符的栈top是)则进行计算直到碰到(。

把a,b什么的都转化成ASCⅡ码【或者什么数的】然后比较两个表达式的计算值。

【上篇】
【下篇】

抱歉!评论已关闭.