解题思路:这一题属于纯粹的栈在求解表达式值上的应用,遇到字母压入栈,遇到")"从栈中弹出两个元素进行运算,具体可以看一下代码及注释。注意先弹出的是第二个矩阵,后弹出的才是第一个矩阵(开始弄反了调试花了不少时间) 题目大意:给你若干个矩阵(x*y),然后给你若干种计算公式,问你在该种计算公式情况下能否进行矩阵乘法运算, 若能进行,输出需进行乘法的次数。
Sample Input
9 A 50 10 B 10 20 C 20 5 D 30 35 E 35 15 F 15 5 G 5 10 H 10 20 I 20 25 A B C (AA) (AB) (AC) (A(BC)) ((AB)C) (((((DE)F)G)H)I) (D(E(F(G(HI))))) ((D(EF))((GH)I))
Sample Output
0 0 0 error 10000 error 3500 15000 40500 47500 15125
#include<iostream>
#include<cstdio>
#include<stack>
#include<string>
using namespace std;
struct A
{
int x;
int y;
}m[27]; //记录矩阵的行列数
stack<A> Q; //设置存放矩阵的栈
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
char c;
cin>>c;
int tmp=c-'A';
cin>>m[tmp].x>>m[tmp].y;
}
string s;
while(cin>>s)
{
while(Q.empty()==false) Q.pop();
int ans=0;
bool error=false;
for(int i=0;i<s.length();i++)
{
if(isalpha(s[i])) //遇到字母将相应矩阵压入栈
{
Q.push(m[s[i]-'A']);
}
else if(s[i]==')') //遇到右括号弹出两个元素进行运算
{
A x1,x2;
x1=Q.top();
Q.pop();
x2=Q.top();
Q.pop();
if(x1.x!=x2.y) //判断两矩阵是否可以相乘,不可以则运算不合法,属于出错
{
error=true;
break;
}
ans+=x1.y*x2.x*x1.x;
A tmp;
tmp.x=x2.x;
tmp.y=x1.y;
Q.push(tmp);
}
}
if(error==true)
{
cout<<"error"<<endl;
}
else
{
cout<<ans<<endl;
}
}
return 0;
}