码迷,mamicode.com
首页 > 其他好文 > 详细

uva-442-矩阵链乘

时间:2014-07-29 17:53:32      阅读:189      评论:0      收藏:0      [点我收藏+]

标签:acm   栈的应用   

<span style="font-size: 18px; ">思路:</span>

本题的关键在于解析表达式.本题的表达式比较简单,可以用一个栈来完成--->>

遇到一个字母时,就入栈;遇到右括号时就出栈进行计算,然后将新矩阵点入栈!

如果在这之间,如果A的列数不等于B的行数,则乘法无法进行!!!注意咯!

代码如下:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<stack>
#include<string>
using namespace std;
struct ma
{
    int h,l;//横和列!
    ma(int l=0,int h=0):l(l),h(h) {}
} m[26];
int main()
{
    int n;
    cin>>n;
    for(int i=0; i<n; i++)
    {
        string name;
        cin>>name;
        cin>>m[name[0]-'A'].h>>m[name[0]-'A'].l;
    }
    string sen;
    while(cin>>sen)
    {
        stack<ma>Q;
        int flag=0,len=sen.length();
        bool error=false;
        int ans=0;
        for(int i=0; i<len; i++)
        {
            if(isalpha(sen[i]))//如果是字母就入栈!
                Q.push(m[sen[i]-'A']);
            else if(sen[i]==')')
            {
                ma m2=Q.top();//倒数第一个!
                Q.pop();
                ma m1=Q.top();//倒数第二个!
                Q.pop();
                if(m1.h!=m2.l)//如果倒数第1个的横长不等于倒数第1个的列长,则退出!
                {
                    //即A的横长!=B的列长!
                    error=true;
                    flag=1;
                    break;
                }
                ans+=m1.h*m1.l*m2.h;
                Q.push(ma(m1.h,m2.l));//然后将新建的点入栈!
            }
            if(flag)
                break;//已经没必要进行循环操作了!
        }
        if(error)
            cout<<"error"<<endl;
        else
            cout<<ans<<endl;
    }
    return 0;
}


uva-442-矩阵链乘,布布扣,bubuko.com

uva-442-矩阵链乘

标签:acm   栈的应用   

原文地址:http://blog.csdn.net/u014004096/article/details/38272721

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!