计算矩阵连乘

#include <cstdio>
#include <cstdlib>
//#define _OJ_
#define maxsize 100

typedef struct matrix
{
    int row;
    int colum;
} matrix;

typedef struct stack1
{
    int top;
    int base;;
    char *elem;
} stack1, *stack;

stack
creat_stack(void)
{
    stack s;
    s = (stack) malloc (sizeof(stack1));
    s->elem = (char*) malloc (sizeof(char) * maxsize);
    s->top = s->base  = 0;
    return s;
}


void
push(stack s, char data)
{
    s->elem[s->top++] = data;
}

char
pop(stack s)
{
    return s->elem[--s->top];
}

int
isempty(stack s)
{
    if(s->top == s->base)
        return 1;
    else
        return 0;
}

char
get_top(stack s)
{
    return s->elem[s->top - 1];
}

// ----------------------------------------------------------------------------------------

// matrix
// operater(matrix M, matrix T)
// {

// }

int
num_multi(stack s, char *str, matrix *M)
{

    int sum = 0, i = 0;
    char ch1;
    while (str[i] != '\0') {
        // printf("%c\n", str[i]);
      if(isempty(s))               push(s, str[i]);
      else if(str[i] == '(')       push(s, str[i]);
      else if('A' <= str[i] && str[i] <= 'Z') {
           if('A' <= get_top(s) && get_top(s) <= 'Z') {
        if(M[str[i] - 'A'].row != M[get_top(s) - 'A'].colum)      return -1;
        sum += M[get_top(s) - 'A'].row * M[get_top(s) - 'A'].colum * M[str[i] - 'A'].colum;
        M[get_top(s) - 'A'].colum = M[str[i] - 'A'].colum;
      }
      else
        push(s, str[i]);
    }

    else if(str[i] == ')') {
       ch1 = pop(s);           pop(s);
       if(isempty(s))          push(s, ch1);
       else {
       if(M[ch1 - 'A'].row != M[get_top(s) - 'A'].colum)      return -1;
       sum += M[get_top(s) - 'A'].row * M[get_top(s) - 'A'].colum * M[ch1 - 'A'].colum;
       M[get_top(s) - 'A'].colum = M[ch1 - 'A'].colum;
       }
    }
    // printf("sum = =%d\n", sum);
    i++;
  }

    return sum;
}



int main(int argc, char const *argv[]) {
#ifndef _OJ_  //ONLINE_JUDGE
    freopen("input.txt", "r", stdin);
#endif

    int result, row1, colum1, T, i, j, n1, n2;
    char str[100];
    char ch;
    matrix M[26];
    stack s;
    s = creat_stack();

    scanf("%d", &T);    gets(str);
    while(T--) {
      scanf("%c %d %d", &ch, &row1, &colum1);
      M[ch - 'A'].row = row1;     M[ch - 'A'].colum = colum1;
      // printf("%c %d %d\n", ch, row1, colum1);
      gets(str);

    }

    gets(str);
    result = num_multi(s, str, M);
    if(result == -1)     printf("error\n");
    else printf("%d\n", result);

    return 0;
}


/*给定n个矩阵{A1,A2,...,An},考察这n个矩阵的连乘积A1A2...An。由于矩阵乘法满足结合律,
故计算矩阵的连乘积可以有许多不同的计算次序,这种计算次序可以用加括号的方式来确定。
矩阵连乘积的计算次序与其计算量有密切关系。
例如,考察计算3个矩阵{A1,A2,A3}连乘积的例子。
设这3个矩阵的维数分别为10*100,100*5,和5*50。若按(A1A2)A3计算,
3个矩阵连乘积需要的数乘次数为10*100*5+10*5*50 = 7500。若按A1(A2A3)计算,
则总共需要100*5*50+10*100*50 = 75000次数乘。
现在你的任务是对于一个确定的矩阵连乘方案,计算其需要的数乘次数。
输入
输入数据由多组数据组成。每组数据格式如下:
第一行是一个整数n (1≤n≤26),表示矩阵的个数。
接下来n行,每行有一个大写字母,表示矩阵的名字,后面有两个整数a,b,分别表示该矩阵的行数和列数
,其中1<a,b<100。
第n+1行是一个矩阵连乘的表达式,由括号与大写字母组成,没有乘号与多余的空格。
如果表达式中没有括号则按照从左到右的顺序计算,输入的括号保证能够配对。
输出
对于每组数据,输出仅一行包含一个整数,即将该矩阵连乘方案需要的数乘次数。
如果运算过程中出现不满足矩阵乘法法则的情况(即左矩阵列数与右矩阵的行数不同),
则输出“error”。

样例输入
3
A 10 100
B 100 5
C 5 50
A(BC)
样例输出
75000*/

  --------------------------------------------------------------------------------------------------------------------------------------

5
A 10 100
B 100 5
C 5 50
D 50 2
E 2 100
A(B(C(D(E))))

-------------

185000;;;;;

posted @ 2015-12-07 21:30  别笑  阅读(1171)  评论(0编辑  收藏  举报