POJ 1363

题意:判断一个栈是否能输出相应的数据

 

思路:

从头开始检查要求的输出。要求数组为a的话,判断a[i]这一位是否可能输出。显然a[i]这一位如果能够按照要求输出,它一定是未压入栈的或者是在栈顶。如果未压入栈,则把它压入栈,当然挡住它的也都被压进去了。如果在栈顶,弹出顶部元素。如果都不符合,输出No

 

统计:200k, 63ms, 2Y,一次把Yes和No的大小写弄错了

 

 #include <iostream> #include <stack> #include <string> #define F(i,a,b) for (int i=a;i<=b;i++) using namespace std; stack<int> st; int a[1001], Q[1001]; bool instack[1001], wait[1001]; int main() { string line; int n; while (scanf("%d", &n) && n!=0) { while (1) { bool done = false; F(i,1,n) { scanf("%d", &a[i]); if (a[i] == 0) { done = true; break; } } if (done) break; //solve while (!st.empty()) st.pop(); F(i,1,n) Q[i] = i; memset(wait, true, sizeof(wait)); memset(instack, 0, sizeof(instack) ); int head = 1; int i; for (i=1;i<=n;i++) { if ( wait[ a[i] ]) { while ( Q[head] != a[i] ) { st.push( Q[head] ); wait[ Q[head] ] = false; instack[ Q[head] ] = true; head++; } wait[ a[i] ]=false; head++; } else if (st.top() == a[i]) { st.pop(); instack[a[i]]=false; } else { printf("No/n"); break; } } if (i==n+1) printf("Yes/n"); } printf("/n"); } return 0; }

你可能感兴趣的:(String,BI)