uva442 栈

题意:给出矩阵规格, 然后给出矩阵算式, 求每个算式的计算量。当矩阵无法相乘时 输出error

思路:1.计算量的计算方式 (A.r, A.c) * (B.r, B.c) 的计算量是 A.r * A.c * B.c()

    2.关键: 用栈在储存矩阵。 遇到 '(' 时读掉, 遇到字母时压栈, 遇到')'时计算栈的顶部两个矩阵, 形成行矩阵压入栈中。

    3.用数组保存读入的矩阵, 26个英文字母 对于1~26.

算法复杂度:还不会算。。。



代码:

/*堆栈*/
#include <stack>
#include <cstdio>
#include <cstring>
using namespace std;

struct SMatrix {
	int row;
	int col;
	static int count;
};

int SMatrix::count = 0;
bool error;

SMatrix mulMatrix(const SMatrix &, const SMatrix &);

int main()
{
	SMatrix matrix[26];
	
	memset(matrix, 0, sizeof(matrix));

	//enter
	int n;
	scanf("%d%*c", &n);
	for (int i = 0; i < n; i++) {
		char ch;
		scanf("%c", &ch);
		scanf("%d%d%*c", &matrix[ch-'A'].row, &matrix[ch-'A'].col);
	}

	char ch;
	stack<SMatrix> staMat;
	error = false;
	while (scanf("%c", &ch) != EOF) {
		if (ch == '\n')	 {
			if (error) {
				printf("error\n");
			}else {
				printf("%d\n", SMatrix::count);
			}
			SMatrix::count = 0;
			error = false;
		}

		if (ch >= 'A' && ch <= 'Z') {
			staMat.push(matrix[ch-'A']);
		}

		if (ch == ')' && staMat.size() > 1) {
			SMatrix left, right, rslt;
			right = staMat.top();
			staMat.pop();
			left  = staMat.top();
			staMat.pop();

			rslt = mulMatrix(left, right);
			staMat.push(rslt);
		}
	}

	return 0;
}

SMatrix mulMatrix(const SMatrix &left, const SMatrix &right)
{
	if (left.col != right.row) {
		error = true;
		return left;
	}else {
		SMatrix::count += left.row * left.col * right.col;
	}

	SMatrix rslt;
	rslt.row = left.row;
	rslt.col = right.col;

	return rslt;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值