Uva442

思路

首先:一开始可能不会想到用栈来做,但是我们来看看计算的过程就知道了,栈的数据结构特性很好
第一:每次乘法只有两个矩阵在运算
第二:每次都优先做括号里面的运算
第三:结合第一第二,我们可以知道,只要一遇到“)”,就可以把之前的两个矩阵来做乘法,再把结果的矩阵放入容器。
结合这个算法的特点,我们用栈就能很好的取执行,一遇到“)”就将栈顶的两个元素取出并做乘法,再把结果矩阵压入栈中即可。
当然,一开始我们还要初始化矩阵信息,不然无法解析字符串中的字母代表的矩阵了

代码

#include <stdio.h>
#include <stack>
#include <iostream>
#include <time.h>
#include <vector>
#include <string>
using namespace std;
struct number {
	int a;
	int b;
}m[26];
int main(void){
	int n;
	cin >> n;
	while (n--) {//初始化矩阵库
		char i;
		int a, b;
		cin >> i >> a >> b;
		m[i - 'A'].a = a;//将26个字母的矩阵值存入对应的索引
		m[i - 'A'].b = b;
	}
	string s;
	cin >> s;
	stack<number> s1;//s1存number类型的数据
	int i = 0;
	int sum = 0;
	while (i < s.length())
	{
		if (s[i] == ')')//如果遇到)就做一次乘法
		{
			number tmp1 = s1.top();
			s1.pop();
			number tmp2 = s1.top();
			s1.pop();
			if (tmp2.b != tmp1.a)
			{
				cout << "error";
				return 0;
			}
			sum += tmp2.a*tmp2.b*tmp1.b;
			number tmp3;
			tmp3.a = tmp2.a;
			tmp3.b = tmp1.b;
			s1.push(tmp3);//在把结果放回去
		}
		if (isalpha(s[i]))//为字母才存入
			s1.push(m[s[i] - 'A']);
		i++;
	}
	cout << sum;
	system("pause");
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值