这道题让我想起去年学数据结构时候做过的实验题:
虽然说难度不同,要实现的目的也不同,但是思路上是完全一致的:把要参与运算的元素和符号分离开来,当触发某一条件时进行运算并对栈进行处理。这道题除了"(“和”)"外没有其他的运算符,所以只创建一个栈。
题目链接:UVa 442
AC代码:
#include <iostream>
#include <stack>
#include <map>
//#include <fstream>
using namespace std;
struct Matrice{
int rows, cols;
Matrice(int a = 0, int b = 0) :rows(a), cols(b) {}
};
map<char, Matrice> mp;
stack<char> letter;
int main() {
int T, rows, cols;
string s;
char ch;
//ofstream out("C:\\Users\\Acer\\Desktop\\1.txt");
cin >> T;
for (int i = 0; i < T; i++) {
cin >> ch >> rows >> cols;
Matrice m(rows, cols);
mp[ch] = m;
}
while (cin >> s) {
bool flag = false;
int sum = 0;
ch = 'a';
while (!letter.empty())
letter.pop();
if (s[0] != '(') {
//if (out.is_open()) {
cout << 0 << endl;
//}
continue;
}
for (int i = 0; i < s.length(); i++) {
if (isalpha(s[i]))
letter.push(s[i]);
else if (s[i] == ')'){
char ch1 = letter.top(); letter.pop(); //栈顶元素,后输入进来的矩阵
char ch2 = letter.top(); letter.pop();
if (mp[ch2].cols != mp[ch1].rows) {
flag = true;
break;
}
sum += mp[ch2].rows * mp[ch2].cols * mp[ch1].cols;
Matrice m(mp[ch2].rows, mp[ch1].cols);
mp[ch] = m;
letter.push(ch);
ch += 1; //防止同名时替换掉mp中的元素
}
}
//if (out.is_open()) {
if (flag)
cout << "error" << endl;
else
cout << sum << endl;
//}
}
return 0;
}