题目:zoj1094
解决思路:
矩阵部分:用一个二维数组储存矩阵的行列,矩阵前的大写字母可以过滤掉。
表达式:用字符数组进行储存,都存入。
对表达式的处理:遇到‘(’就进行过滤,因为对于乘法而言,它不起作用。然后遇到‘)’就弹出栈的两个元素进行行列式计算,计算之后得到的新的矩阵的行列再压入栈中。最后,遇到字母就查找对应的矩阵的行列进行压入栈中。
AC代码:
#include<iostream>
#include<stack>
#include <string.h>
using namespace std;
int a[50][2];
struct mat {
int row;
int col;
};
int main() {
//将矩阵行列读入二维数组a:
int n;
cin >> n;
char c, str[1000];//c过滤前面的大写字母;
stack<mat>s;
for (int i = 0; i < n; i++) cin >> c >> a[i][0] >> a[i][1];
while (cin >> str) {
int sum = 0;//总的计算数。
int len = strlen(str);
bool flag = true;
for (int i = 0; i < len; i++) {
if (str[i] == '(')continue;
else {
//碰到)就弹出栈中的两个字母计算。
if (str[i] == ')') {
mat temp1, temp2,temp3;
temp1 = s.top(); s.pop();
temp2= s.top(); s.pop();
if (temp2.col == temp1.row) {
sum =sum+ temp2.row * temp2.col * temp1.col;//计算
temp3.row = temp2.row; temp3.col = temp1.col;//复制结果
s.push(temp3);//归栈。
}
else {
cout << "error" << endl;
flag = false;
break;
}
}
//字母转化进栈:
else {
int pos = str[i] - 'A';//定位矩阵位置
mat temp;
temp.row = a[pos][0];
temp.col = a[pos][1];
s.push(temp);//归栈。
}
}
}
if(flag)cout << sum << endl;//
}
return 0;
}