• 矩阵链乘(解析表达式)


    题目

    输入n个矩阵的维度和一些矩阵链乘表达式,输出乘法的次数。如果无法进行乘法,输出error.假定A是m*n矩阵,B是n*p矩阵,则乘法次数为m*n*p;如果A的列数不等于B的行数,则乘法无法进行。

    解题思路

    本体的关键是解析表达式。本题的表达式比较简单,可以用一个栈来完成:遇到字母时直接入栈,遇到右括号时出栈(出栈两个并计算,然后将结果入栈)。因为输入保证合法,左括号不用管。

    代码实现

     1 #include<stdio.h>
     2 #include<stack>
     3 #include<string>
     4 #include<iostream>
     5 using namespace std;
     6 
     7 struct Matrix
     8 {
     9     int a, b;
    10     Matrix(int a = 0,int b = 0):a(a),b(b) {}
    11 }m[26];
    12 
    13 stack<Matrix>s;
    14 
    15 int main()
    16 {
    17     int n;
    18     scanf("%d", &n);
    19     for (int i = 0; i < n; i++)
    20     {
    21         char name[10];
    22         scanf("%s", name);
    23         int k = name[0] - 'A';
    24         scanf("%d%d", &m[k].a, &m[k].b);
    25     }
    26     string expr;
    27     while (cin >> expr)
    28     {
    29         int len = expr.length();
    30         bool flag = false;
    31         int res = 0;
    32         for (int i = 0; i < len; i++)
    33         {
    34             char ch = expr[i];
    35             if (isalpha(ch))  s.push(m[ch - 'A']);
    36             if (ch == ')')
    37             {
    38                 Matrix m1 = s.top(); s.pop();
    39                 Matrix m2 = s.top(); s.pop();  //注意顺序,m2其实在m1前面
    40                 s.push(Matrix(m2.a, m1.b));
    41                 if (m2.b != m1.a) { flag = true; break; }
    42                 res += m2.a * m2.b * m1.b;
    43             }
    44         }
    45         if (flag)  printf("error
    ");
    46         else  printf("%d
    ", res);
    47     }
    48     return 0;
    49 }
  • 相关阅读:
    使用redis配置分布式session
    邮件发送整合
    Spark基础-scala学习(八、隐式转换与隐式参数)
    QMQ去哪儿网-mq中间件(启动失败)
    Spark基础-scala学习(七、类型参数)
    JMH实践-代码性能测试工具
    Spark基础-scala学习(五、集合)
    [JavaWeb基础] 012.Struts2 自定义标签使用
    html5学习之路_003
    [Objective-C] 017_UI篇_UIView(中)
  • 原文地址:https://www.cnblogs.com/lfri/p/9774611.html
Copyright © 2020-2023  润新知