UVA-442
题意:给出n个矩阵的信息,然后给若干个表达式,求每个表达式计算到最后要进行多少次乘法运算。
解题思路:写一个栈,非 ) 就进栈,遇到 ) 进不断出栈到 ( 为止,计算其中乘法的运算次数。然后两个矩阵A ,B,乘法次数为A.x*B.x*B.y,新矩阵C.x=A.x , C.y=B.y。
/*************************************************************************
> File Name: UVA-442.cpp
> Author: Narsh
>
> Created Time: 2016年07月16日 星期六 10时57分36秒
************************************************************************/
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
struct node {
char z;
int x,y;
} a[30000],s[200];
int la,lb,n;
long long sum =0;
int main () {
scanf("%d\n",&n);
for (int i =1; i <= n; i++) {
char k;
scanf("%c",&k);
scanf("%d%d\n",&s[k].x,&s[k].y);
}
string b;
while (cin>>b) {
bool tag=true;
lb=b.length();
la = 0;
b=" "+b;
sum = 0;
for (int i = 1; i <= lb; i++){
la++;
if (b[i] == '(') a[la].z = '(';
if (b[i] != '(' && b[i] != ')') {
a[la].z = '+';
a[la].x=s[b[i]].x;
a[la].y=s[b[i]].y;
}
if (b[i] == ')') {
la--;
while (a[la].z != '(') {
if (a[la-1].z == '+') {
if (a[la].x != a[la-1].y) {
tag=false;
break;
}
a[la-1].y = a[la].y;
sum+=a[la-1].x*a[la].x*a[la].y;
}
la--;
}
if (a[la+1].z == '+') a[la]=a[la+1];
}
}
if (tag) printf("%lld\n",sum);
else printf("error\n");
}
}