九度 1366 栈的压入弹出序列

题目描述:

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。

输入:

每个测试案例包括3行:

第一行为1个整数n(1<=n<=100000),表示序列的长度。

第二行包含n个整数,表示栈的压入顺序。

第三行包含n个整数,表示栈的弹出顺序。

输出:

对应每个测试案例,如果第二个序列是第一个序列的弹出序列输出Yes,否则输出No。

样例输入:
5
1 2 3 4 5
4 5 3 2 1
5
1 2 3 4 5
4 3 5 1 2

样例输出:

            Yes

            No

#include 
#include 
#include 
#include  
 
using namespace std;
 
bool isPopOrder(const vector &push, const vector &pop, int length)
{
     bool sequence = false;
      
     if(push.empty() || pop.empty() || length < 0)
        return sequence;
      
     vector::const_iterator iNextPush = push.begin();
     vector::const_iterator iNextPop  = pop.begin();
      
     stack stack;
      
     while(iNextPop - pop.begin() < length)
     {
         while(stack.empty() || stack.top() != *iNextPop)
         {
              if(iNextPush - push.begin() == length)
                  break;
               
              stack.push(*iNextPush);
              ++iNextPush;     
         }
          
         if(stack.top() != *iNextPop)
              break;
          
         stack.pop();
         ++iNextPop;
     }
      
     if(stack.empty() && iNextPop - pop.begin() == length)//这是if 不是while 
         sequence = true;
          
     return sequence;
}
 
int main(int argc, char *argv[])
{
    int n;
    while(scanf("%d", &n) != EOF)
    {
        int value;
        vector push, pop;
         
        int i;
        for(i = 0; i < n; ++i)
        {
            scanf("%d", &value);
            push.push_back(value);
        }
         
        for(i = 0; i < n; ++i)
        {
            scanf("%d", &value);
            pop.push_back(value);
        }
         
        if(isPopOrder(push, pop, n))
            printf("Yes\n");
        else
            printf("No\n");
         
         
    }
     
     
    return 0;
}


你可能感兴趣的:(算法,数据结构,算法与数据结构)