Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1584546
  • 博文数量: 399
  • 博客积分: 8508
  • 博客等级: 中将
  • 技术积分: 5302
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-14 09:28
个人简介

能力强的人善于解决问题,有智慧的人善于绕过问题。 区别很微妙,小心谨慎做后者。

文章分类

全部博文(399)

文章存档

2018年(3)

2017年(1)

2016年(1)

2015年(69)

2013年(14)

2012年(17)

2011年(12)

2010年(189)

2009年(93)

分类: LINUX

2009-10-31 17:22:27


假设入栈序列A按照1,2,3,4...n   编号。  
  每次我们可以把序列A中的第一个元素移入堆栈,  
  也可以是从堆栈顶弹出一个元素放入出栈序列B.  
  这样,经过n次入栈和出栈操作后,我们可以得到一个出栈序列B。  
   
  现在,你的任务是对给定的一段序列B:  
  判断序列B是不是序列A:{1,2,3,4...}的出栈序列。  
   
  为了简化大家编程,你只要给出一个像下面这样的函数就行了:  
   
  bool   is_valid_sqnc(int*   s,   int   n);  
   
  其中    
  s:             表示待检验的序列,  
  n:             表示序列s中元素的个数。(1   <   n   <   100)  
  返回值:如果序列s是序列{1,2,3...n}的出栈序列,函数返回   TRUE   ,反之,返回FALSE。    
   
  example:  
  s={3,1,2};           n=3;           返回值:   FALSE      
  s={4,3,2,1};       n=4;           返回值:   TRUE  
  s={1,4,2,3,5};   n=5;           返回值:   FALSE  
   
  (检验序列中不会出现相同编号元素,编号小于1,或大于n等明显错误情况。  
  如s={0,1,5,5}.)  

方法一:

bool   is_valid_sqnc(int*   s,   int   n)   {  
          if(s[0]<1   ||   s[0]>n)   return   false;  
          for(j=1;   j<=s[0];   j++)   stack[top++]   =   j;  
          top--;   //   第一个出栈  
          i=1;  
          while(i                   if(s[i]<0   ||   s[i]>n)   return   false;   //检查范围  
                  if(s[i]>s[i-1])   {  
                          for(;j<=s[i];j++)   stack[top++]   =   j;  
                          top--;   //   又找到一个  
                  }  
                  else   {  
                          e   =   stack[--top];     //   是当前考察元素吗?  
                          if(e!=s[i])   return   false;  
                  }  
                  i++;  
          }  
          return   true;  
  }  

方法二:充要条件
/*    
    *   若出栈序列合法,则一定不存在   1<=i     *  
    */  
   
  int   is_valid_sqnc(int   *s,   int   n)  
  {  
          int   i,j,k;  
           
          for(i=0;i                   for(j=i+1;j                           if(s[j]                                   for(k=j+1;k           if(s[k]>s[j]&&s[k]                                   }  
                          }  
                  }  
          }  
   
          return   1;  
  }
 
阅读(4188) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~