UVA442题解

题意

输入n个矩阵的维度及其链乘表达式,计算乘法的次数,如果乘法无法进行,输出error。

思路

使用栈去解析表达式。
一开始没有仔细看给出的表达式格式,没发现括号里面之多有两个元素,所以才有了下面的代码,用了三个栈,nump是存矩阵下标的,num是存中间结果矩阵的行数列数的,op是存括号的。
但是实际上,因为这个题括号里面必定只有两个元素,所以使用一个栈也是能做的。方法就是只存中间结果,矩阵来了就存,右括号来了就算,括号根本不用进栈就行。
但是因为我用最开始的代码ac了,所以后面只用一个栈的做法就没有再写。

代码

#include<stack>
#include<cstdio>
using namespace std;

int row[30]={0};
int col[30]={0};

int main()
{
	int n;
	scanf("%d\n",&n);
	char m;
	int temprow,tempcol;
	for(int i=0;i<n;++i)
	{
		scanf("%c %d %d\n",&m,&temprow,&tempcol);
		row[m-'A']=temprow;
		col[m-'A']=tempcol;
	}
	stack<int>num;
	stack<char>op;
	stack<int>nump;
	int ret,error;
	char input[1000];
	char cur;
	while(scanf("%s",input)!=EOF)
	{
		if(!input[1])
		{
			printf("0\n");
			continue;
		}
		while(!num.empty())num.pop();
		while(!op.empty())op.pop();
		while(!nump.empty())nump.pop();
		ret=0,error=0;
		int i=0;
		while(input[i])
		{
			if(input[i]=='(')op.push(i);
			else if(input[i]==')')
			{
				if(nump.top()-1==op.top())
				{
					op.pop(),++i;
					continue;
				}
				tempcol=num.top();
				num.pop();
				temprow=num.top();
				num.pop();
				if(num.top()!=temprow)
				{
					error=1;
					break;
				}
				num.pop();
				ret+=(num.top()*temprow*tempcol);
				num.push(tempcol);
				op.pop(),nump.pop();
			}
			else
			{
				if(input[i-1]!='('&&input[i-1]!=')')
				{
					tempcol=num.top();
					num.pop();
					temprow=num.top();
					if(tempcol!=row[input[i]-'A'])
					{
						error=1;
						break;
					}
					ret+=(tempcol*temprow*col[input[i]-'A']);
					num.push(col[input[i]-'A']);
				}
				else
				{
					nump.push(i);
					num.push(row[input[i]-'A']);
					num.push(col[input[i]-'A']);
				}
			}
			++i;
		}
		if(error)printf("error\n");
		else printf("%d\n",ret);
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值