题意
输入n个矩阵的维度及其链乘表达式,计算乘法的次数,如果乘法无法进行,输出error。
思路
使用栈去解析表达式。
一开始没有仔细看给出的表达式格式,没发现括号里面之多有两个元素,所以才有了下面的代码,用了三个栈,nump是存矩阵下标的,num是存中间结果矩阵的行数列数的,op是存括号的。
但是实际上,因为这个题括号里面必定只有两个元素,所以使用一个栈也是能做的。方法就是只存中间结果,矩阵来了就存,右括号来了就算,括号根本不用进栈就行。
但是因为我用最开始的代码ac了,所以后面只用一个栈的做法就没有再写。
代码
#include<stack>
#include<cstdio>
using namespace std;
int row[30]={0};
int col[30]={0};
int main()
{
int n;
scanf("%d\n",&n);
char m;
int temprow,tempcol;
for(int i=0;i<n;++i)
{
scanf("%c %d %d\n",&m,&temprow,&tempcol);
row[m-'A']=temprow;
col[m-'A']=tempcol;
}
stack<int>num;
stack<char>op;
stack<int>nump;
int ret,error;
char input[1000];
char cur;
while(scanf("%s",input)!=EOF)
{
if(!input[1])
{
printf("0\n");
continue;
}
while(!num.empty())num.pop();
while(!op.empty())op.pop();
while(!nump.empty())nump.pop();
ret=0,error=0;
int i=0;
while(input[i])
{
if(input[i]=='(')op.push(i);
else if(input[i]==')')
{
if(nump.top()-1==op.top())
{
op.pop(),++i;
continue;
}
tempcol=num.top();
num.pop();
temprow=num.top();
num.pop();
if(num.top()!=temprow)
{
error=1;
break;
}
num.pop();
ret+=(num.top()*temprow*tempcol);
num.push(tempcol);
op.pop(),nump.pop();
}
else
{
if(input[i-1]!='('&&input[i-1]!=')')
{
tempcol=num.top();
num.pop();
temprow=num.top();
if(tempcol!=row[input[i]-'A'])
{
error=1;
break;
}
ret+=(tempcol*temprow*col[input[i]-'A']);
num.push(col[input[i]-'A']);
}
else
{
nump.push(i);
num.push(row[input[i]-'A']);
num.push(col[input[i]-'A']);
}
}
++i;
}
if(error)printf("error\n");
else printf("%d\n",ret);
}
return 0;
}