<span style="font-size: 18px; ">思路:</span>
本题的关键在于解析表达式.本题的表达式比较简单,可以用一个栈来完成--->>
遇到一个字母时,就入栈;遇到右括号时就出栈进行计算,然后将新矩阵点入栈!
如果在这之间,如果A的列数不等于B的行数,则乘法无法进行!!!注意咯!
代码如下:
#include<cstdio> #include<cstring> #include<iostream> #include<stack> #include<string> using namespace std; struct ma { int h,l;//横和列! ma(int l=0,int h=0):l(l),h(h) {} } m[26]; int main() { int n; cin>>n; for(int i=0; i<n; i++) { string name; cin>>name; cin>>m[name[0]-'A'].h>>m[name[0]-'A'].l; } string sen; while(cin>>sen) { stack<ma>Q; int flag=0,len=sen.length(); bool error=false; int ans=0; for(int i=0; i<len; i++) { if(isalpha(sen[i]))//如果是字母就入栈! Q.push(m[sen[i]-'A']); else if(sen[i]==')') { ma m2=Q.top();//倒数第一个! Q.pop(); ma m1=Q.top();//倒数第二个! Q.pop(); if(m1.h!=m2.l)//如果倒数第1个的横长不等于倒数第1个的列长,则退出! { //即A的横长!=B的列长! error=true; flag=1; break; } ans+=m1.h*m1.l*m2.h; Q.push(ma(m1.h,m2.l));//然后将新建的点入栈! } if(flag) break;//已经没必要进行循环操作了! } if(error) cout<<"error"<<endl; else cout<<ans<<endl; } return 0; }
原文地址:http://blog.csdn.net/u014004096/article/details/38272721