水题,这一题上面用栈会比较好 #include <cstdio> #include <algorithm> #include <cstring> using namespace std; const int MAX = 1000; typedef struct _Node { char name[81]; int weight; }Node; Node data[ MAX ]; int stack[ MAX ]; int stacki; int n; char input[MAX]; int inputi; bool cmp( const Node& left , const Node& right ) { return strcmp( left.name , right.name ) < 0; } int binarysearch( int left , int right , char* key ) { int middle; while( left <= right ) { middle = ( left + right )/2; if( strcmp( data[ middle ].name , key ) == 0 ) return middle; else if( strcmp( data[middle].name , key ) < 0 ) left = middle + 1 ; else right = middle - 1 ; } return -1; } int getnumber() { int result = 0 ; while( input[inputi] >= '0' && input[ inputi ] <= '9' ) { result = result * 10 + input[ inputi ] - '0'; ++inputi; } return result; } int getatom() { char buffer[64]; int k = 0; buffer[k++] = input[inputi++]; while( input[inputi] >= 'a' && input[inputi] <= 'z' ) { buffer[k++] = input[inputi++]; } buffer[k] = '/0'; int mid = binarysearch( 0 , n - 1 , buffer ); if( mid == -1 ) return -1; else return data[mid].weight; } int find() { stacki = 0 ; inputi = 0 ; while( input[inputi] != '/0' ) { if( input[inputi] == '(' ) { stack[ stacki++ ] = -1; inputi++; } else if( input[inputi] == ')' ) { stack[ stacki++ ] = -1; inputi++; } else if( input[inputi] >= 'A' && input[inputi] <= 'Z' ) { stack[ stacki++ ] = getatom(); if( stack[ stacki - 1 ] == -1 ) return -1; } else { int number = getnumber(); if( stack[ stacki - 1 ] != -1 ) stack[ stacki - 1 ] *= number; else { int mid = 0 ; --stacki; while( stack[ stacki - 1 ] != -1 ) mid += stack[ --stacki ]; stack[ stacki - 1 ] = mid * number; } } } int result = 0 ; while( stacki != 0 ) result += stack[--stacki]; return result; } int main() { n = 0 ; while( scanf("%s",data[n].name) , strcmp( data[n].name , "END_OF_FIRST_PART") != 0 ) { scanf("%d",&data[n].weight); ++n; } sort( &data[0] , &data[n] , cmp ); while( scanf("%s",input),strcmp( input , "0") != 0 ) { int result = find(); if( result == -1 ) printf("UNKNOWN/n"); else printf("%d/n",result); } return 0; }