POJ1363 栈的应用 xingxing在努力

  这道题给你一个1-N的数问能不能通过出栈入栈操作达到给定的序列。考虑给定的一个序列的第i个数, 假设这个数已经在栈中那么看一下栈顶的元素是不是这个数,不是就是NO, 假设这个数没有在栈中那么将这个数以及他前面的数都入栈, 再将这个数出栈,即可。。。代码如下:

  

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <stack>

using namespace std;
int n;
int a[1000 + 10];
bool in[1000 + 10];
stack<int> st;
int main()
{
    while(scanf("%d", &n) == 1 && n)
    {
        while(1)
        {
            scanf("%d", &a[0]);
            if(a[0] == 0) { printf("\n"); break; }
            for(int i=1; i<n; i++)
                scanf("%d", &a[i]);
            memset(in, 0, sizeof(in));
            while(!st.empty()) st.pop();
            bool res = true;
            for(int i=0; i<n; i++)
            {
                if(in[a[i]])     //这个元素已经入栈
                {
                    if(st.top() != a[i]) { res = false; break; }
                    st.pop();
                }
                else
                {
                    int num = a[i];
                    int j = num;
                    while(!in[j] && j>=0) j--;
                    for(j=j+1; j<=num; j++)
                    {
                        st.push(j);
                        in[j] = 1;
                    }
                    st.pop();
                }
            }
            if(res)
                printf("Yes\n");
            else
                printf("No\n");
        }
    }
    return 0;
}

 

posted @ 2015-11-22 14:45  xing-xing  阅读(113)  评论(0)    收藏  举报