UVA 327 - Evaluating Simple C Expressions(枚举就OK)

来源:互联网 发布:淘宝卖电影资源被罚 编辑:程序博客网 时间:2024/06/03 16:57
#include <cctype>#include <cstdlib>#include <cstring>#include <iostream>#include <algorithm>#include <cstdio>#include <map>#include <stack>using namespace std;#define M 10000char str[M];int len=0;map<char,int> m;stack<int> s;void initmap(){    for(char x='a'; x<='z'; x++)        m[x]=x-'a'+1;}//sign->push , alphabet-> calculatevoid solve(){    int i=0;    while(i<len)    {        //cout<<"cccc"<<endl;        if(i+2<len&&str[i]=='+'&&str[i+1]=='+'&&isalpha(str[i+2]))//++a        {            m[str[i+2]]+=1;            //cout<<m['a']<<endl;            if(!s.empty())            {                s.pop();                s.push(s.top()-m[str[i+2]]);            }            else                s.push(m[str[i+2]]);            i+=2;        }        else if(i+2<len&&str[i]=='-'&&str[i+1]=='-'&&isalpha(str[i+2]))//--a        {            m[str[i+2]]-=1;            if(!s.empty())            {                s.pop();                s.push(s.top()+m[str[i+2]]);            }            else                s.push(m[str[i+2]]);            i+=2;        }        else if(isalpha(str[i])&&str[i+1]=='+'&&str[i+2]=='+')//a++        {            if(!s.empty())            {                s.push(s.top()+m[str[i]]);                s.pop();            }            else                s.push(m[str[i]]);            m[str[i]]+=1;            i+=2;        }        else if(isalpha(str[i])&&str[i+1]=='-'&&str[i+2]=='-')//a--        {            if(!s.empty())            {                s.push(s.top()-m[str[i]]);                s.pop();            }            else                s.push(m[str[i]]);            m[str[i]]-=1;            i+=2;        }        //a+b        else if(s.empty()&&isalpha(str[i]))        {            s.push(m[str[i]]);        }        else if(str[i]=='+')        {            s.push(m[str[i+1]]+s.top());        }        else if(str[i]=='-')        {            s.push(s.top()-m[str[i+1]]);        }        ++i;    }}int cmp(char s1,char s2){    return s1<s2;}int main(){    while(gets(str))    {        len=0;        printf("Expression: %s\n",str);        for(int i=0; i<strlen(str); i++)        {            if(str[i]==' ')continue;            else str[len++]=str[i];        }        initmap();        while(!s.empty())            s.pop();        solve();        printf("    value = %d\n",s.top());        int k=0;        for(int i=0; i<len; i++)        {            if(isalpha(str[i]))                str[k++]=str[i];        }        sort(str,str+k,cmp);//        for(int i=0; i<k; i++)//            printf("%c",str[i]);        for(int i=0; i<k; i++)            printf("    %c = %d\n",str[i],m[str[i]]);    }    return 0;}



小毕的代码,肿么写这么少啊,5。。。想法好好啊,不过是我给你改过的,吼吼~~~

#include <cstdio>#include <cstring>#include <cstdlib>#include <algorithm>#include <cctype>#include <cmath>#include <iostream>using namespace std;int main(){    char s[11000];    while(gets(s))    {        printf("Expression: %s\n", s);        int len=0;        for(int i=0; i<strlen(s); i++)            if(s[i]!=' ')                s[len++]=s[i];        int al[30];        for(int i = 1; i <= 26; ++i)            al[i] = i;        int ans[11000];        int len_ans = 0;        bool vis[30];        memset(vis, false, sizeof(vis));        for(int i = 0; i < len; ++i)        {            if(isalpha(s[i]))            {                vis[s[i]-'a'+1] = true;                if(i-2 >= 0&&s[i-1] == s[i-2])                {                    if(s[i-1] == '-') --al[ s[i] - 'a' + 1 ];                    else ++al[ s[i] - 'a' + 1];                    s[i-1] = s[i-2] = ' ';                }                ans[len_ans++] = al[s[i] - 'a' + 1];                if(i+2 < len && s[i+1] == s[i+2])                {                    if(s[i+1] == '-') --al[s[i]-'a'+1];                    else ++al[s[i]-'a'+1];                    s[i+1] = s[i+2] = ' ';                }            }        }        int sum = ans[0];        for(int i = 0, k = 1; i < len; ++i)        {            if(s[i] == '-')                sum -= ans[k++];            else if(s[i] == '+')                sum += ans[k++];        }        printf("    value = %d\n", sum);        for(int i = 1; i <= 26; ++i)            if(vis[i])                printf("    %c = %d\n", 'a'+i-1, al[i]);    }    return 0;}


0 0
原创粉丝点击