本题主要是对栈的应用。
将矩阵作为结构体,创建结构体栈处理矩阵计算式。
从左到右处理计算式,左括号和矩阵直接入栈,右括号则取出栈顶的两个矩阵,相乘后入栈(入栈前将与右括号匹配的左括号出栈),并累加计算次数。
处理完计算式后,所得的总计算次数即为所求。
#include <iostream>
#include <string>
#include <stack>
using namespace std;
struct matrix //矩阵
{
char letter;
int row;
int column;
}M[26];
int main()
{
int n;
cin >> n;
for (int i = 0; i < n; i++) //输入矩阵
{
cin >> M[i].letter >> M[i].row >> M[i].column;
}
string str; //计算式
stack<matrix> s;
matrix left = { '(', -1, -1 }; //左括号(-1无意义)
matrix right = { ')', 1, 1 }; //右括号(1无意义)
matrix mul_left, mul_right, product; //左乘数,右乘数,乘积
while (cin >> str)
{
int len = str.length();
if (len == 1) //计算式长度为1,无需计算
{
cout << 0 << endl;
continue;
}
while (!s.empty()) //清空前次计算的栈残留
s.pop();
int total = 0; //总计算次数
bool flag = true; //是否能够计算
for (int i = 0; i < len; i++) //从左到右依次处理计算式
{
if (str[i] == '(') //左括号,直接入栈
{
s.push(left);
}
else if (str[i] == ')')
{ //右括号,先出栈右乘数,再出栈左乘数,两者相乘(如果能乘)
//出栈和右括号匹配的左括号,乘积入栈
mul_right = s.top(); //右乘数
s.pop();
mul_left = s.top(); //左乘数
s.pop();
if (mul_left.column != mul_right.row) //无法相乘
{
cout << "error" << endl;
flag = false;
break;
}
total += mul_left.row * mul_left.column * mul_right.column;
product.row = mul_left.row;
product.column = mul_right.column;
s.pop(); //左括号出栈
s.push(product); //乘积入栈
}
else //矩阵
{
for (int j = 0; j < n; j++) //寻找对应的矩阵结构体,入栈
{
if (M[j].letter == str[i])
{
s.push(M[j]);
break;
}
}
}
}
if (flag == true) //能够相乘
cout << total << endl;
}
return 0;
}
继续加油。