标签:
链接:http://acm.hust.edu.cn/vjudge/problem/19085
分析:用栈来实现一个简单的表达式求值。输入表达式保证合法,比如(A(BC))把BC看成一个整体D那么(A(BC))就是AD,所以这些表达式都是在不断重复嵌套相同的结构A*B。遍历表达式,遇到字母则将对应矩阵压入栈中,遇到右括号则将栈顶两个矩阵弹出,判断是否能进行乘法,如果能则累加乘法次数,再将相乘后的矩阵压栈,如果不能则将error置为true,退出循环。
1 #include <iostream> 2 #include <string> 3 #include <stack> 4 using namespace std; 5 6 struct Matrix { 7 int a, b; 8 Matrix(int a = 0, int b = 0): a(a), b(b) {} 9 } m[26]; 10 11 stack<Matrix> s; 12 13 int main() { 14 int n; 15 cin >> n; 16 for (int i = 0; i < n; i++) { 17 string name; 18 cin >> name; 19 int k = name[0] - ‘A‘; 20 cin >> m[k].a >> m[k].b; 21 } 22 string expr; 23 while (cin >> expr) { 24 int len = expr.length(); 25 bool error = false; 26 int ans = 0; 27 for (int i = 0; i < len; i++) { 28 if (isalpha(expr[i])) s.push(m[expr[i] - ‘A‘]); 29 else if (expr[i] == ‘)‘) { 30 Matrix m2 = s.top(); s.pop(); 31 Matrix m1 = s.top(); s.pop(); 32 if(m1.b != m2.a) { error = true; break; } 33 ans += m1.a * m1.b * m2.b; 34 s.push(Matrix(m1.a, m2.b)); 35 } 36 } 37 if (error) cout << "error" << endl; else cout << ans << endl; 38 } 39 return 0; 40 }
UVa442 Matrix Chain Multiplication (栈)
标签:
原文地址:http://www.cnblogs.com/XieWeida/p/5827750.html