c++ 矩阵链乘

/*
问题:输入n个矩阵的维度和一些矩阵链乘表达式,输出乘法的次数.如果无法进行,输出error.如果A是m*n矩阵,B是n*p的矩阵,乘法次数为m*n*p
    如果A的列数不等于B的行数,则乘法无法进行.
解题思路:利用结构体存储矩阵的行数和列数,然后利用stack 进行运算 遇见字母进栈,遇见右括号出栈 计算
样例输入:

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))

样例输出:

0
0
0
error
10000
error
3500
15000
40500
47500
15125
*/
#include <iostream>
#include <cstdio>
#include <stack>
#include <string>
using namespace std;
struct Matrix{
    int a,b;//分别是结构体的行数和列数
    Matrix(int na=0,int nb=0){//结构体的构造方法
        a=na;
        b=nb;
    }
} m[26];
stack<Matrix> s;
int main()
{
    int n;
    cin>>n;
    for(int i=0;i<n;i++){
        string name;//就只包含一个字符A ,B等
        cin>>name;
        int k=name[0]-'A';//把字符转成数字
        cin>>m[k].a>>m[k].b;//输入矩阵的行数和列数
    }
    string expr;//需要计算的表达式
    while(cin>>expr){
        int len=expr.length();//长度
        bool error=false;//flag
        int ans=0;//结果
        for(int i=0;i<len;i++){//遍历表达式的每一个元素
            //若是字母 把相应的矩阵的压进栈
            if(isalpha(expr[i]))s.push(m[expr[i]-'A']);
            //若是右括号 进行抛出栈的元素进行计算
            else if(expr[i]==')'){
                Matrix m2=s.top();//获取栈顶元素
                s.pop();//抛出栈顶元素
                Matrix m1=s.top();
                s.pop();
                //判断是否能够计算 当左的列=右的行时 才能计算
                if(m1.b!=m2.a){
                    error=true;
                    break;
                }
                ans+=m1.a*m1.b*m2.b;//计算结果
                s.push(Matrix(m1.a,m2.b));//结果作为新的矩阵 压进栈
            }
        }
        if(error)printf("error\n");
        else printf("%d\n",ans);
    }

    return 0;
}

posted @ 2017-04-12 19:49  qingtianBKY  阅读(858)  评论(0编辑  收藏  举报