题目地址: http://poj.org/problem?id=1363

此题只需验证是否为合法的出栈序列。

有两个思路:
1、每个已出栈之后的数且小于此数的数都必须按降序排列。复杂度O(n^2),适合人脑。

//思路 1 不对!!!

例如 数据 ,               3 5 2 4 1              --------                正确答案为 no

//貌似这个数据确实是no,当时想错了,后面的判断完不能标记为出栈,

但是修改了下代码还是没过。。。

附上修改后代码:

//wrong      poj 1363
//accepted zoj 1259
//accepted uva 514
#include<iostream>
#include<cstring>
#include <algorithm>
using namespace std;
const int maxn=1000+10;
int main()
{
int a[maxn];
// int b[maxn];//不用保留是否出栈了
int n;
while(cin>>n && n!=0)
{
while(1)
{
memset(a,0,sizeof(a));
// memset(b,0,sizeof(b));
int i,j;
int x;
cin>>a[1];
if(a[1]==0)
break;
for(i=2;i<=n;i++)
cin>>a[i];
int max;
int t=true;
for(i=1;i<=n;i++)
{
// if(b[i]!=1)
// {
// b[i]=1;
max=a[i];
for(j=i+1;j<=n;j++)
{
if(a[j]<max)//if(a[j]<max&&b[j]!=1)
{
if(a[j]!=max-1)
{
t=false;
break;
}
else
{
max--;
// b[j]=1;
}
}
}
// }
if(t==false)
break;
}
if(t==false)
cout<<"No"<<endl;
else
cout<<"Yes"<<endl;
}
cout<<endl;
}
return 0;
}

2、另一个思路就是直接模拟入栈出栈过程。虽然模拟毫无技巧可言,但复杂度O(n),优于算法1。适合电脑。

代码如下:

[java] view
plain
copy

 
  1. for(i = 0; i < N; i++){
  2. if(index < data[i]){
  3. while(index < data[i]){
  4. stack.push(++index);
  5. }
  6. stack.pop();
  7. } else if(stack != null && stack.peek().equals(new Integer(data[i]))){
  8. stack.pop();
  9. } else {
  10. flag = "No";
  11. break;
  12. }
  13. }
  14. <span style="font-size:18px;">题目只用于验证,倒不难,不过我想问如果让求出所有合法的出栈序列该怎么求????有高效的算法吗?</span>
----------------------------------------------------------
代码 按思路 1 做的,错误。。测试数据 ,3 5 2 4 1  正确答案应该是 no

//wrong      poj 1363
//accepted zoj 1259
//accepted uva 514
#include<iostream>
#include<cstring>
#include <algorithm>
using namespace std;
const int maxn=1000+10;
int main()
{
int a[maxn];
int b[maxn];
int n;
while(cin>>n && n!=0)
{
while(1)
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
int i,j;
int x;
cin>>a[1];
if(a[1]==0)
break;
for(i=2;i<=n;i++)
cin>>a[i];
int max;
int t=true;
for(i=1;i<=n;i++)
{
if(b[i]!=1)
{
b[i]=1;
max=a[i];
for(j=i+1;j<=n;j++)
{
if(a[j]<max&&b[j]!=1)
{
if(a[j]!=max-1)
{
t=false;
break;
}
else
{
max--;
b[j]=1;
}
}
}
}
if(t==false)
break;
}
if(t==false)
cout<<"No"<<endl;
else
cout<<"Yes"<<endl;
}
cout<<endl;
}
return 0;
}

---------------------------------------
课本 正确代码 ,较复杂。

#include<iostream>
#include<cstring>
using namespace std;
const int maxn=1000+10;
int main()
{
int n,p[maxn]; cin>>n;
while(n)
{
int x,max=0;
cin>>x;
while(x)
{
memset(p,0,sizeof(p));
bool valid=true;
for(int i=1;i<=n;i++)
{
if(valid)
{
bool ok=true;
for(int i=x+1;i<=max;i++)
if(p[i]==1)
{
ok=false;
break;
}
if(!ok)
valid=false;
else
{
max=(max>x?max:x);
p[x]=2;
for(int i=x-1;i>0 && !p[i];i--)
p[i]=1;
}
}
if(i<n)
cin>>x;
}
cout<<(valid ? "Yes" : "No")<<endl;
cin>>x;
}
cout<<endl;
cin>>n;
}
return 0;
}

------------------------------------------------------------

POJ1363 Rails 验证出栈序列问题的更多相关文章

  1. 牛客网剑指offer第21题——判断出栈序列是否是入栈序列

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

  2. PAT线性结构_一元多项式求导、按给定步长反转链表、出栈序列存在性判断

    02-线性结构1. 一元多项式求导 (25) 设计函数求一元多项式的导数.(注:xn(n为整数)的一阶导数为n*xn-1.) 输入格式:以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过100 ...

  3. Catalan数 && 【NOIP2003】出栈序列统计

    令h(1)=1, h(0)=1,catalan数满足递归式: h(n)=h(0)*h(n-1)+h(1)*h(n-2)+...+h(n-1)h(0) (n>=2) =C(2n, n)/(n+1) ...

  4. 【转】【数据结构】【有n个元素依次进栈,则出栈序列有多少种】

    卡特兰数 大神解释:https://blog.csdn.net/akenseren/article/details/82149145      权侵删 原题 有一个容量足够大的栈,n个元素以一定的顺序 ...

  5. 【剑指offer】判断出栈序列是否合法

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

  6. pat--7-11 出栈序列的合法性(25 分)

    7-11 出栈序列的合法性(25 分) 给定一个最大容量为 M 的堆栈,将 N 个数字按 1, 2, 3, ..., N 的顺序入栈,允许按任何顺序出栈,则哪些数字序列是不可能得到的?例如给定 M=5 ...

  7. vijos - P1122出栈序列统计 (卡特兰数)

    P1122出栈序列统计 未递交 标签:NOIP普及组2003[显示标签] 描写叙述 栈是经常使用的一种数据结构,有n令元素在栈顶端一側等待进栈,栈顶端还有一側是出栈序列. 你已经知道栈的操作有两·种: ...

  8. 一个栈的入栈序列为ABCDEF,则不可能的出栈序列是

    技术之瞳 阿里巴巴技术笔试心得习题2.65:  一个栈的入栈序列为ABCDEF,则不可能的出栈序列是(D)  A.DEFCBA B.DCEFBA C.FEDCBA  D.FECDBA E.ABCDEF ...

  9. 【NOJ2024】入栈序列和出栈序列

    入栈序列和出栈序列 时间限制(普通/Java):1000MS/3000MS         运行内存限制:65536KByte 总提交:293          测试通过:68 比赛描述 给出入栈序列 ...

随机推荐

  1. rsync客户端命令使用简介

    rsync是linux下很流行的增量备份工具,也支持本地文件(夹)复制至远程,而且支持只传输增量部分,也是一个代码(程序)发布的好工具. 基本用法如下: rsync [一堆选项] 源文件(夹) 目标文 ...

  2. SPSS统计功能与模块对照表

    SPSS统计功能 - 应用速查表第一列为统计方法,中间为统计功能,最后一列为所在模块 1 ANOVA Models(单因素方差分析:简单因子) : 摘要 描述 方差 轮廓 - SPSS Base 2 ...

  3. saltstack内置执行模块useradd

    useradd模块用于命令行管理用户 salt.modules.useradd.add(name, uid=None, gid=None, groups=None, home=None, shell= ...

  4. unity中动态生成网格

    以下是绘制正方形面片的一个例子,方便之后查阅: 效果如图所示: 红轴为x方向,蓝轴为z方向. 代码如下: using System.Collections; using System.Collecti ...

  5. getMeasuredHeight(),getScrollY(),getHeight()的区别和联系

    前言:关于控件的高度有两种获取方式,一个是获得控件的实际大小(getMeasuredHeight),就是包含显示部分和已显示的部分: 而getHeight是获得控件的显示的大小,如果控件大小超出的屏幕 ...

  6. linux php.ini又一次载入问题

    今天发现自己server改动php.ini之后无法又一次载入! .无法使用php-fpm reload,奇怪.! 后来查了一下.能够使用 /etc/init.d/php-fpm reload 来又一次 ...

  7. 简单记事本&Java

    目标: 学习java的IO流和文件的打开保存 内容: 使用javaSwing包里面的一些东西,比如按钮.菜单来进行布局 代码: package myNotePad; import java.awt.F ...

  8. Earth Hour(最短路)

    Earth Hour Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 125536/65536 K (Java/Others)Total ...

  9. Just a Hook(线段树)

    Just a Hook Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  10. 记录-MySQL中的事件调度Event Scheduler

    下面是自己的实例 /*查询event是否开启(查询结果Off为关闭 On为开启)*/show variables like '%sche%'; /*开启/关闭命令(1开启--0关闭)*/set glo ...