Tyvj1043

来源:互联网 发布:vr核心算法 编辑:程序博客网 时间:2024/06/06 07:06

题目链接

分析:
这题堪比立方图
实在是需要耐心和细心
我觉得noip之前做一些这样的题可以提高自己的稳定程度

首先要在整个式子外加一个()
数字好处理,直接塞到一个数字
当遇到符号的时候,先判断一下ta与符号栈栈顶元素的优先级关系
如果栈顶是 ( ,就直接入栈
如果出现优先级不增的情况就要计算
如果当前是 ) ,就匹配括号

tip

有可能式子中会出现负数
计算中就当-操作处理
要是最后的答案是负数
就看一下符号栈栈顶是不是 - 号
是的话输出负数就好了

这里写代码片#include<cstdio>#include<iostream>#include<cstring>using namespace std;char s[50];int len,num[50];int f[50],tf,tn;int KSM(int a,int b){    int t=1;    while (b)    {        if (b&1)           t=t*a;        b>>=1;        a=a*a;    }    return t;}int get(char c){    if (c=='(') return 6;    if (c==')') return 7;    if (c=='^') return 5;    if (c=='+') return 1;    if (c=='-') return 2;    if (c=='*') return 3;    if (c=='/') return 4;}int js(){    if (tn==1&&f[tf]==2)    {        tf--;        num[tn]=-num[tn];        return 0;    }    int a=num[tn--];    int b=num[tn--];    int x=f[tf--];    if (x==5) num[++tn]=KSM(b,a);    if (x==1) num[++tn]=a+b;    if (x==2) num[++tn]=b-a;    if (x==3) num[++tn]=a*b;    if (x==4) num[++tn]=b/a;}int pd(int x){    int y=f[tf];    if (x==6||x==7) return 0;    if (x==5&&y==5) return 1;    if ((x==1||x==2)&&y!=6) return 1;    if (x==3&&(y==3||y==4||y==5)) return 1;    if (x==4&&(y==3||y==4||y==5)) return 1;    return 0;}void doit(){    int i=0,j;    tf=tn=0;    while (i<len)    {        int d=0;        if (s[i]>='0'&&s[i]<='9')        {            while (s[i]>='0'&&s[i]<='9'&&i<len)               d=d*10+s[i]-'0',i++;            num[++tn]=d;            continue;        }        else        {            int r=get(s[i]);             while (pd(r)) js();            if (r==7)            {                while (f[tf]!=6) js();                tf--;            }            else f[++tf]=r;            i++;        }       }    while (tn!=1) js();   //}int main(){    scanf("%s",s+1);    s[0]='(';    len=strlen(s);    s[len]=')';    len++;    doit();    printf("%d",num[1]);    return 0;}
原创粉丝点击