思路
首先:一开始可能不会想到用栈来做,但是我们来看看计算的过程就知道了,栈的数据结构特性很好
第一:每次乘法只有两个矩阵在运算
第二:每次都优先做括号里面的运算
第三:结合第一第二,我们可以知道,只要一遇到“)”,就可以把之前的两个矩阵来做乘法,再把结果的矩阵放入容器。
结合这个算法的特点,我们用栈就能很好的取执行,一遇到“)”就将栈顶的两个元素取出并做乘法,再把结果矩阵压入栈中即可。
当然,一开始我们还要初始化矩阵信息,不然无法解析字符串中的字母代表的矩阵了
代码
#include <stdio.h>
#include <stack>
#include <iostream>
#include <time.h>
#include <vector>
#include <string>
using namespace std;
struct number {
int a;
int b;
}m[26];
int main(void){
int n;
cin >> n;
while (n--) {//初始化矩阵库
char i;
int a, b;
cin >> i >> a >> b;
m[i - 'A'].a = a;//将26个字母的矩阵值存入对应的索引
m[i - 'A'].b = b;
}
string s;
cin >> s;
stack<number> s1;//s1存number类型的数据
int i = 0;
int sum = 0;
while (i < s.length())
{
if (s[i] == ')')//如果遇到)就做一次乘法
{
number tmp1 = s1.top();
s1.pop();
number tmp2 = s1.top();
s1.pop();
if (tmp2.b != tmp1.a)
{
cout << "error";
return 0;
}
sum += tmp2.a*tmp2.b*tmp1.b;
number tmp3;
tmp3.a = tmp2.a;
tmp3.b = tmp1.b;
s1.push(tmp3);//在把结果放回去
}
if (isalpha(s[i]))//为字母才存入
s1.push(m[s[i] - 'A']);
i++;
}
cout << sum;
system("pause");
}