题目:UVa 442 Matrix Chain Multiplication
题目分析:
关键是解析表达式,可以用栈来解决:遇到字母时入栈,遇到右括号时出栈并且计算,然后结果入栈。因为输入保证合法,括号无需入栈。
#include <iostream> #include <cstdio> #include <stack> #include <string> using namespace std; struct Matrix{ int a,b; Matrix(int a=0,int b=0):a(a),b(b){} }m[26]; stack<Matrix> s; int main(){ int n; cin >> n; for(int i=0; i<n; ++i){ string name ; //a capital letter specifying the name of the matrix. cin >> name; int k = name[0]-'A'; cin >> m[k].a >> m[k].b; } string expr;//expression while(cin >> expr){ int len = expr.length(); bool error = false; int ans = 0; for(int i=0; i<len; ++i){ if(isalpha(expr[i])) s.push(m[expr[i]-'A']); else if(expr[i] == ')'){ Matrix m2 = s.top();s.pop(); Matrix m1 = s.top();s.pop(); if(m1.b != m2.a){error = true;break;} ans += m1.a * m1.b * m2.b; s.push(Matrix(m1.a,m2.b)); } } if(error) printf("error\n"); else printf("%d\n",ans); } return 0; }