POJ2045Molecular Formula 栈模拟

这个题很。。。写3个小时。。。

就是用一个栈模拟一下表达式的堆砌,将表达式中符号变为数值,压入栈中,然后在遇到‘)’时,将值弹出乘以相应的倍数,再压入栈中。

 

#include<iostream>
#include<string>
#include<map>
#include<ctype.h>
using namespace std;
map<string,int> word_v;
int stack[100];
int top;
int main()
{
    string name;
    int v;
    while(1)
    {
        cin>>name;
        if(name.compare("END_OF_FIRST_PART")==0)
        break;
        cin>>v;
        word_v[name]=v;
    }
    string f;
    while(1)
    {
        int sum,top=0,unknow=0;
        memset(stack,0,sizeof(stack));
        string temp;
        cin>>f;
        if(f[0]=='0')
        return 0;
        for(int i=0;i<f.length();i++)
        {
            temp.clear();
            if(isupper(f[i]))
            {
                temp+=f[i];
                if(i+1<=f.length()-1&&islower(f[i+1]))
                {
                    temp+=f[i+1];
                    if(word_v[temp]==0)
                    {
                        cout<<"UNKNOWN"<<endl;
                        unknow=1;
                        break;
                    }
                    if(i+2<=f.length()-1&&isdigit(f[i+2]))//大写+小写+数字
                    {
                        int number;
                        if(i+3<=f.length()-1&&isdigit(f[i+3]))
                        {
                            number=(f[i+2]-'0')*10+(f[i+3]-'0');
                        }
                        else number=f[i+2]-'0';
                        stack[++top]=word_v[temp]*number;
                        i+=2;
                        continue;
                    }
                    //大写+小写后面无数字
                    stack[++top]=word_v[temp];
                    ++i;
                    continue;
                }
                if(word_v[temp]==0)
                    {
                        cout<<"UNKNOWN"<<endl;
                        unknow=1;
                        break;
                    }
                if(i+1<=f.length()-1&&isdigit(f[i+1]))
                    {
                        int number;
                        if(i+2<=f.length()-1&&isdigit(f[i+2]))//大写+数字
                        {
                            number=(f[i+1]-'0')*10+(f[i+2]-'0');
                        }
                        else number=f[i+1]-'0';
                        stack[++top]=word_v[temp]*number;
                        ++i;
                        continue;
                    }
                    stack[++top]=word_v[temp];//大写后面无数字
            }
            else if(f[i]=='(')
            {
                stack[++top]=-2;
            }
            else if(f[i]==')')
            {
                int tempsum=0;
                int number=f[i+1]-'0';
                while(stack[top]!=-2)
                {
                    tempsum+=stack[top];
                    --top;
                }
                if(i+2<=f.length()-1&&isdigit(f[i+2]))
                number=(f[i+1]-'0')*10+(f[i+2]-'0');
                tempsum=tempsum*number;
                stack[top]=tempsum;
                ++i;
            }
        }
        if(!unknow)
        {
            int an=0;
            for(int i=0;i<=top;i++)
                an+=stack[i];
            cout<<an<<endl;
        }
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值