说说:
其实这道题是栈这个数据结构最经典的运用,即表达式的求值。与一般情况不同的是,此次要求的运算数是矩阵。在整个解析表达式的过程中,无非遇到三类字符,一个是‘(‘,另一个是‘)’,剩下的就是运算数了。首先,在遇到‘(’的时候,栈指针自动加一,并将栈顶元素的行数和列数都设置为-1,这样就不会和正常的运算数混淆了。如果遇到的是运算数,首先要判断当前的栈顶元素是否为运算数(当然,还要注意栈为空的特殊情况)。若是,则直接将新的运算数与栈顶运算数进行计算,否则将新运算数入栈。还有最后一种情况就是遇到‘)’。此时,栈顶必为运算数,且栈顶的下一个元素必定是‘(’所以只要将栈顶元素下移一位即可。在这里有一点要特别注意,此时可能会出现两个栈的顶部出现连续的两个运算数(至多两个,三个是不可能的),因为在这种情况下,我们还要对这两个元素进行运算。不断重复上述步骤,整个题目就搞定啦!
源代码:
#include <stdio.h>
#define MAXN 26+5
typedef struct{
int x;
int y;
}Matrix;
int main(){
int n,i,p,wrong,ans;
char c;
Matrix stack[MAXN],current,data[MAXN];
// freopen("data","r",stdin);
scanf("%d\n",&n);
for(i=0;i<n;i++)
scanf("%c %d%d\n",&c,&data[i].x,&data[i].y);
while(1){
p=wrong=ans=0;
while((c=getchar())!='\n'){
if(c=='('){
stack[p].x=stack[p].y=-1;//填充无效数,栈指针上移
p++;
}
else if(c==')'){
p--;
stack[p-1].x=stack[p].x;//栈顶元素向下移动一位
stack[p-1].y=stack[p].y;
if(p-2>=0&&stack[p-2].x!=-1){//若此时栈顶存在连续两个运算数
p--;
if(stack[p-1].y!=stack[p].x)
wrong=1;
ans+=stack[p-1].x*stack[p-1].y*stack[p].y;
stack[p-1].y=stack[p].y;
}
}
else{
if(p==0||stack[p-1].x==-1){
stack[p].x=data[c-'A'].x;
stack[p].y=data[c-'A'].y;
p++;
}
else{
if(stack[p-1].y!=data[c-'A'].x)
wrong=1;
ans+=stack[p-1].x*stack[p-1].y*data[c-'A'].y;
stack[p-1].y=data[c-'A'].y;
}
}
}
if(wrong)//wrong为1标识着在运算过程中存在着不符合矩阵运算法则的情况
printf("error\n");
else
printf("%d\n",ans);
if((c=getchar())==EOF)
break;
else
ungetc(c,stdin);
}
return 0;
}Matrix Chain Multiplication UVA 442 (栈 表达式求值)
原文地址:http://blog.csdn.net/u011915301/article/details/39032515