【UVA-442】解题报告(STL,栈)

原始题目

题目大意

给出\(n\)个矩阵的行数和列数(矩阵名为A到Z),再给出一些表达式,根据表达式的运算规则计算是否合法,若合法 计算出乘法次数。

解题思路

简单的表达式解析可以通过栈实现,输入右括号时计算,输入字母时压入栈。

解题代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <cstdio>
#include <bits/stdc++.h>
#define rep(i,a,n) for(int i=a;i<n;++i)
#define per(i,a,n) for(int i=n-1;i>=a;--i)
#define clint(x,a) memset(x,a,sizeof(int)*n)
#define clll(x,a) memset(x,a,sizeof(ll)*n)
#define pb push_back
#define np next_permutation
#define mp make_pair
#define fi first
#define se second
#define INF 0x3f3f3f3f
#define EPS 1e-8
#define PI acos(-1.0)
using namespace std;
const int maxn=1e5+5;
const int maxm=1e5+5;
const int maxl=26;



typedef long long ll;
typedef unsigned long long ull;
typedef vector<int> vi;
typedef pair<int,int> pii;
typedef pair<string,string> pss;

int t,n;
struct Matrix{
int a,b;
Matrix(int a=0,int b=0):a(a),b(b){}
}m[26];
int main(){
ios::sync_with_stdio(false);
cin>>n;
rep(i,0,n){
char c;
cin>>c;
cin>>m[c-'A'].a>>m[c-'A'].b;
}

string str;
while(cin>>str){
stack <Matrix> s;
bool flag=0;
int ans=0;
int len=str.length();
rep(i,0,len){
if(isalpha(str[i])){
if(flag) break;
s.push(m[str[i]-'A']);
}
else if(str[i]==')'){
Matrix m1,m2;
if(flag) break;
m1=s.top();s.pop();
m2=s.top();s.pop();
if(m1.a!=m2.b){
flag=1;
break;
}
else{
ans+=m2.a*m1.b*m1.a;
s.push(Matrix(m2.a,m1.b));
}

}
}
if(flag) cout<<"error"<<endl;
else cout<<ans<<endl;
}

}

收获与反思

注意读题,表达式的范式。