算法之矩阵运算

 

 分析和思路:建立矩阵和输入字符的映射关系后,对表达式进行计算

 1 // MatrixCalculate.cpp : 定义控制台应用程序的入口点。
 2 //
 3 
 4 #include "string"
 5 #include "map"
 6 #include "iostream"
 7 using namespace std;
 8 
 9 #if 0 
10 int main()
11 {
12 
13     pair<int,int> p1(50,50);
14     map<string,pair<int,int>> m;
15     
16     m["A"]=p1;
17     cout<<m["A"].first;
18 
19     return 0;
20 }
21 #endif
22 
23 //解题思路:
24 //遍历从起始位置遍历字符串,遇到(字符就入栈,遇到)要出栈了,并且进行计算,直到字符串为空结束
25 //还需要和输入的计算法则建立映射关系。
26 #include "iostream"
27 #include "string"
28 #include "vector"
29 #include "map"
30 #include "stack"
31 using namespace std;
32 int result=0;
33 pair<int,int> backResult(0,0);
34 void docal(stack<pair<int,int>> &st,stack<char> &so,map<char,pair<int,int>> &m){
35     pair<int,int> p1;
36     pair<int,int> p2;
37     p2=st.top();
38     st.pop();
39     p1=st.top();
40     st.pop();
41     result+=p1.first*p2.second*p1.second;
42     backResult.first=p1.first;
43     backResult.second=p2.second;
44     st.push(backResult);
45     so.pop();
46 }
47 
48 int main()
49 {
50     int matrix_number=0;
51     while(cin>>matrix_number){
52         pair<int,int> p1;
53         vector<pair<int,int>> v;
54         for(int i=0;i<matrix_number;i++){
55             int row=0;
56             int col=0;
57             cin>>row>>col;
58             p1.first=row;
59             p1.second=col;
60             v.push_back(p1);
61         }
62         string input;
63         cin>>input;
64         map<char,pair<int,int>> m;
65         int index=0;
66         for(int i=0;i<input.size();i++){
67             if((input[i]=='(')||(input[i]==')')){
68                 continue;
69             }
70             m[input[i]]=v[index++];
71         }
72         stack<pair<int,int>> st;
73         stack<char> so;
74         for(int i=0;i<input.size();i++){
75             if(input[i]!=')'||(input[i]>='A'&&input[i]<='Z')){
76                 pair<int,int> temp(0,0);
77                 if(input[i]>='A'&&input[i]<='Z')
78                 {
79                   pair<int,int> temp=m[input[i]];
80                    st.push(temp);
81                 }
82                 if(input[i]=='(')
83                 so.push(input[i]);//改变思路:鉴于在(AB)C与A(BC)的时候,会引起backResult的计算混乱,所以
84                 //so保存pair结构可以解决这个问题
85                 continue;
86             }
87         //    while(!so.empty()&&so.top()!='(')
88             if(st.size()>=2&&!so.empty()){
89                 docal(st,so,m);
90             }
91         }
92         cout<<result<<endl;
93         result=0;}    
94 }

别人的代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int main() {
 4     int n;    //矩阵的个数n
 5     while(cin>>n) {
 6         vector<pair<int, int>> matrix;    //存放每个矩阵的行数和列数
 7         for(int i=0;i<n;i++) {    //依次输入n个矩阵的行数和列数,并保存在容器matrix中
 8             int row,arrange;
 9             cin>>row>>arrange;
10             matrix.push_back(make_pair(row, arrange));
11         }
12         string rule;    //存放计算的法则
13         cin>>rule;    //输入法则rule
14         stack<char> sign;    //符号栈
15         stack<pair<int, int>> Stack_matrix;    //矩阵栈
16         int count=0;    //乘法次数
17         for(int i=0;i<rule.length();i++) {    //按照计算法则求矩阵的乘法次数
18             if(rule[i]=='(') {    //'('为待匹配的符号,压入符号栈中
19                 sign.push(rule[i]);
20             }else if(rule[i]>='A' && rule[i]<='Z') {    //如果为字母,将该字母对应的矩阵添加到矩阵栈中
21                 Stack_matrix.push(matrix[rule[i]-'A']);
22             }else if(rule[i]==')') {    //如果当前符号为')',将符号栈中的'('出栈
23                 sign.pop();
24                 pair<int, int> matrix2 = Stack_matrix.top();    //依次弹出矩阵栈的两个栈顶矩阵
25                 Stack_matrix.pop();
26                 pair<int, int> matrix1 = Stack_matrix.top();
27                 Stack_matrix.pop();
28                 count += matrix1.first*matrix1.second*matrix2.second;    //累加乘法次数
29                 Stack_matrix.push(make_pair(matrix1.first, matrix2.second));    //将矩阵相乘的结果重新压入栈中
30             }
31         }
32         cout<<count<<endl;    //输出矩阵相乘的乘法总次数
33     }
34     return 0;
35 }

 

posted @ 2022-03-05 23:04  技术笔记记录  阅读(117)  评论(0)    收藏  举报