例题6-3 UVa442-Matrix Chain Multiplication

这道题让我想起去年学数据结构时候做过的实验题:
这道题难多了QAQ
虽然说难度不同,要实现的目的也不同,但是思路上是完全一致的:把要参与运算的元素和符号分离开来,当触发某一条件时进行运算并对栈进行处理。这道题除了"(“和”)"外没有其他的运算符,所以只创建一个栈。

题目链接: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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值