超级水题,其实可以只用两个栈就可以了。 #include <cstdio> using namespace std; const int MAX = 1010; int InputStack[MAX]; int MidStack[MAX]; int ResultStack[MAX]; int n; int InputStackI,MidStackI; int main() { int mid; bool isok; bool isfirst = true; while( scanf("%d",&n) , n != 0 ) { if( !isfirst ) printf("/n"); isfirst = false; while( scanf("%d",&mid) , mid != 0 ) { ResultStack[0] = mid; for( int i = 1 ; i < n ; ++i ) scanf("%d",&ResultStack[i]); for( int i = 0 ; i < n ; ++i ) InputStack[i] = n - i ; InputStackI = n; MidStackI = 0 ; for( int i = 0 ; i < n ; ++i ) if( MidStackI != 0 && MidStack[ MidStackI - 1 ] == ResultStack[i] ) { MidStackI--; } else { isok = false; while( InputStackI != 0 ) { if( InputStack[ InputStackI - 1 ] == ResultStack[i] ) { isok = true; InputStackI--; break; } else { MidStack[ MidStackI++ ] = InputStack[ --InputStackI ]; } } if( isok == false ) break; } if( isok ) printf("Yes/n"); else printf("No/n"); } } return 0; }