模拟类似括号匹配

http://   www.bnuoj.com/bnuoj/contest_show.php?cid=3902#problem/44159

在数的两边加上一对括号

#include<stdio.h>
#include<string.h>
#define N 200
#include<stack>
using namespace std;
struct node {
   int c,h;
}cur,next;
int main() {
  int i,len;
  char s[N];
  while(scanf("%s",s)!=EOF) {
        stack<node>q;
    cur.c=0;cur.h=0;
   len=strlen(s);
   s[len]=')';
   s[len+1]='1';
   cur.c=0;cur.h=0;
   q.push(cur);
  q.push(cur);
   for(i=0;i<=len+1;i++) {
    if(s[i]=='C') {
        if(s[i+1]>='0'&&s[i+1]<='9') {
            cur.c+=s[i+1]-'0';
            i++;
        }
        else
            cur.c++;
    }
    if(s[i]=='H') {
        if(s[i+1]>='0'&&s[i+1]<='9') {
            cur.h+=s[i+1]-'0';
            i++;
        }
        else
            cur.h++;
    }
    if(s[i]=='(') {
        next=q.top();
        q.pop();
        next.c+=cur.c;
        next.h+=cur.h;
        q.push(next);
        cur.c=0;cur.h=0;
        q.push(cur);
       }
       if(s[i]==')') {
        next=q.top();
        q.pop();
        next.c+=cur.c;
        next.h+=cur.h;
        if(s[i+1]>='0'&&s[i+1]<='9') {
            cur=q.top();
            q.pop();
            cur.c=cur.c+next.c*(s[i+1]-'0');
            cur.h=cur.h+next.h*(s[i+1]-'0');
            q.push(cur);i++;
        }
        else  {
            cur=q.top();
            q.pop();
            cur.c+=next.c;
            cur.h+=next.h;
            q.push(cur);
        }
        cur.c=0;
        cur.h=0;
       }
   }
   next=q.top();
   if(next.h==next.c*2+2)
    printf("Alkane\n");
   else
   printf("Alkene\n");
  }
return 0;
}

posted @ 2014-05-09 17:09  HYDhyd  阅读(161)  评论(0编辑  收藏  举报