zoukankan      html  css  js  c++  java
  • 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 ");
            else printf("%d ",ans);
        }

        return 0;
    }

  • 相关阅读:
    xScrapBook
    使用STL仿函数和判断式来降低复杂性并改善可读[转]
    C++ 开源程序库[转]
    资源泄漏的悲剧
    Excel导入的HDR=YES; IMEX=1详解
    largeint.lib
    共享刚写的简单DirectUI库 只实现了思想
    document.body.scrollTop的值总为零的解决办法
    CDCHandle谨慎使用
    C++中std::tr1::function和bind 组件的使用
  • 原文地址:https://www.cnblogs.com/qingtianBKY/p/6701006.html
Copyright © 2011-2022 走看看