日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CSP化学方程式题解

發布時間:2024/1/8 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CSP化学方程式题解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

CSP化學方程式題解

題目描述

題目分析

本題主要考察棧的應用(也可以采用遞歸的方式,效率低),是一道與編譯原理相關的題目。
首先我采用的是類似于哈希表的方法存儲的元素位置及其數量,當然也可以用stl的map。
然后棧里存的是元素所在位置,進而在遇到相應符號(比如+、)、’\0’)時將對應區間里的數乘以相應的倍數。
最后便是得到各類符號時采取的相應操作,如下所示:

  • 元素:存入鏈表,元素個數初始化為1
  • (:入棧,當前鏈表大小入棧
  • ):后面若跟有數,則相應區間內的元素個數乘以此數
  • =:轉到另一面;若前一化學式前有系數,則需要將對應區間內元素乘以此數
  • :若之前符號為+、=或在起始位置,則為化學式系數;反之則將之前的元素乘以此數
  • +:若前一化學式前有系數,則需要將對應區間內元素乘以此數
  • C++源碼

    #include<iostream> #include<cstring> #include<cstdio> #include<vector> #include<stack> using namespace std;enum symbol{nul,sym,number,lp,rp,add,equ}; typedef enum symbol symbol; typedef vector< pair<int,int> > vec; const int MAX=1e3+4;char c[MAX]; int a[2][27*26]={0}; bool ce=0; int ind,num;symbol getsym(int &ind) {symbol symtmp;if(c[ind]=='\0')return nul;if(c[ind]=='+')symtmp=add,ind++;else if(c[ind]=='(')symtmp=lp,ind++;else if(c[ind]==')')symtmp=rp,ind++;else if(c[ind]=='=')symtmp=equ,ind++;else if(c[ind]>='A'&&c[ind]<='Z'){symtmp=sym;num=c[ind++]-'A';if(c[ind]>='a'&&c[ind]<='z')num=(num+1)*26+c[ind++]-'a';}else if(c[ind]>='0'&&c[ind]<='9'){symtmp=number;num=0;while(c[ind]>='0'&&c[ind]<='9'){num*=10;num+=c[ind++]-'0';}}return symtmp; }bool solve() {int now=0,shu=1;bool xuan=0,rpy=1;stack<int> bracket;vec v[2];symbol lsym=add;symbol Sym=getsym(ind);while(Sym){switch(Sym){case sym:v[ce].push_back(make_pair(num,1));break;case lp:bracket.push(v[ce].size());break;case rp:Sym=getsym(ind);if(Sym==number){for(int i=bracket.top();i<v[ce].size();i++)v[ce][i].second*=num;}else{lsym=rp;rpy=0;}bracket.pop();break;case equ:if(xuan){for(int i=now;i<v[ce].size();i++)v[ce][i].second*=shu;xuan=0;}ce=!ce;Sym=add;break;case number:if(lsym!=add)v[ce][v[ce].size()-1].second*=num;else{shu=num;now=v[ce].size();xuan=1;}break;case add:if(xuan){for(int i=now;i<v[ce].size();i++)v[ce][i].second*=shu;xuan=0;}break;}if(rpy){lsym=Sym;Sym=getsym(ind);}else{rpy=1;}}if(xuan){for(int i=now;i<v[ce].size();i++)v[ce][i].second*=shu;xuan=0;}for(int i=0;i<2;i++)for(int j=0;j<v[i].size();j++){a[i][v[i][j].first]+=v[i][j].second;}for(int i=0;i<27*26;i++)if(a[0][i]!=a[1][i]){return false;}return true; }int main() {int e;scanf("%d",&e);while(e--){ce=0;ind=0;memset(a,0,sizeof(a));scanf("%s",c);bool jud=solve();if(jud)puts("Y");elseputs("N");}return 0; }

    不足之處敬請指正!

    總結

    以上是生活随笔為你收集整理的CSP化学方程式题解的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。