uva 442

#include <iostream> using namespace std ; const int maxn = 26 + 10 ; struct Matrix { char name ; int r ; int c ; int num ; } mat , node1 , node2 , node ; struct { char str[100+10] ; int top ; } pStack ; struct { Matrix mat[maxn] ; int top ; } mStack ; int mapr[maxn] , mapc[maxn] ; void init() { memset( pStack.str , 0 , sizeof( pStack.str ) ) ; for( int i = 0 ; i < maxn ; i++ ) { mStack.mat[i].r = 0 ; mStack.mat[i].r = 0 ; } pStack.top = 0 ; return ; } //是括号 bool is_par( char c ) { if( c == '(' || c == ')' || c == '[' || c == ']' ) return true ; return false ; } //括号能配对 bool match( char c1 , char c2 ) { if( ( c1 == '(' && c2 == ')' ) || ( c1 == '[' && c2 == ']' ) ) return true ; return false ; } //两个矩阵能否相乘 bool can_mul( int r , int c ) { if( r == c ) return true ; return false ; } //矩阵相乘,并返回相乘后的矩阵大小 Matrix multiply( Matrix a , Matrix b ) { Matrix t ; t.c = a.c ; t.r = b.r ; return t ; } int main() { init() ; memset( mapr , 0 , sizeof( mapr ) ) ; memset( mapc , 0 , sizeof( mapc ) ) ; int nmat ; cin >> nmat ; for( int i = 0 ; i < nmat ; i++ ) { cin >> mat.name >> mat.r >> mat.c ; mapr[mat.name] = mat.r ;//映射矩阵的长 mapc[mat.name] = mat.c ;//映射矩阵的宽 } getchar() ; char str[200] ; memset( str , 0 , sizeof( str ) ) ; while( gets( str ) ) { int flag = 0 ; init() ; long long ans = 0 ; int len = strlen( str ) ; for( int i = 0 ; i < len ; i++ ) { if( is_par( str[i] ) && ! match( pStack.str[pStack.top] , str[i] ) )//如果括号不能配对入括号栈 { pStack.top++ ; pStack.str[pStack.top] = str[i] ; } else if( is_par( str[i] ) && match( pStack.str[pStack.top] , str[i] ) )//如果括号能配对,计算矩阵乘积,保存结果并让新矩阵入矩阵栈 { pStack.top-- ; node1 = mStack.mat[mStack.top] ; mStack.top-- ; node2 = mStack.mat[mStack.top] ; mStack.top-- ; //cout << node1.name << " " << node2.name << endl ; if( ! can_mul( node1.r , node2.c ) ) { cout << "error" << endl ; flag = 1 ; break ; } node = multiply( node1 , node2 ) ; ans += node2.r * node2.c * node1.c ; mStack.top++ ; mStack.mat[mStack.top] = node ; } else if( isalpha( str[i] ) )//如果是字母,入矩阵栈 { mStack.top++ ; mStack.mat[mStack.top].name = str[i] ; mStack.mat[mStack.top].r = mapr[str[i]] ; mStack.mat[mStack.top].c = mapc[str[i]] ; } } if( ! flag ) cout << ans << endl ;//本次如果没输出过,输出ans } return 0 ; }

你可能感兴趣的:(c,struct,include,Matrix)