栈(出栈序列)

已知自然数1,2,...,N(1≤N≤10000)依次入栈(即a<b当且仅当a先于b入栈),问:序列C1,C2,...,CN是否为可能的出栈序列。
  例如:N=5时,3,4,2,1,5是一个可能的出栈序列,因为其可以按如下操作获得:push 1,push 2,push 3,pop,push 4,pop,pop,pop,push 5,pop

Input

 输入数据包含若干组测试样例。
  每组测试样例的第一行为整数N(1≤N≤10000);
  第二行为N个正整数,以空格隔开,为出栈序列;
  输入数据的末尾以一个0表示输入的结束。

Output

对于每组测试样例,输出结果为一行字符串。
  如给出的序列是可能的出栈序列,则输出"Yes",否则输出"No"。
  注意:区分大小写,引号本身不输出。

Sample Input

5
3 4 2 1 5
5
3 5 1 4 2
0

Sample Output

Yes
No
#include<iostream>
#include<cstdio>
#include<stack>
#include<stdio.h>
using namespace std;
int main()
{
    stack<int> s;
    int a[10000]={0};
    int n,flag,i,j,top;
    while(1)
    {
        scanf("%d",&n);
        for(i=0;i<=n-1;++i)
            scanf("%d",&a[i]);
        if(n==0)
            return 0;
        flag=1;
        for(i=1;i<=a[0];++i)
            s.push(i);
        s.pop();
        for(j=1;j<=n-1;++j)
        {
            if(a[j]>a[j-1])
                for(i=a[j-1]+1;i<=a[j];++i)
                {
                    s.push(i);
                    s.pop();
                }
            else
            {
                top=s.top();
                if(top==a[j])
                    s.pop();
                else
                {
                    flag=0;
                    break;
                }
            }
        }
        if(flag==1)
            printf("Yes\n");
        else
            printf("No\n");
    }
    return 0;
}
时间: 2024-11-03 21:17:38

栈(出栈序列)的相关文章

BZOJ 3786 星系探索 Splay维护树的入栈出栈序

题目大意:给出一棵树,要求有以下这些操作:1.求出一个节点到根的点权和.2.将一个节点的父亲改变.3.将一个子树中的每一个节点都加上一个权值. 思路:LCT就不用想了,因为有子树操作.然后就是一个很神奇的东西了,就是Splay维护树的入栈出栈序.这个玩应是做了这个题之后才知道的.但是感觉真的很dio. 首先,我们先按照题意,将树建出来.然后从根开始深搜,这样一个点进入DFS函数和出DFS函数的时候就会有两个时间点,就是入栈的时间和出栈的时间.然后利用Splay维护一个序列,就是入栈出栈的顺序.在

压栈出栈遍历栈实例代码

#include<stdio.h> #include<stdlib.h> #include<malloc.h> typedef struct Node//定义一个链表结构体 { int data; struct Node* pNext; }NODE,*PNODE; typedef struct Stack//定义一个栈结构体 { PNODE pTop; PNODE pBottom; }STACK,*PSTACK; void initStack(PSTACK); void

顺序栈的初始化入栈出栈以及打印栈的信息

使用的开发工具CLion CLion 2017.2.1 Build #CL-172.3544.40, built on August 2, 2017Licensed to CLion EvaluatorExpiration date: September 15, 2017JRE: 1.8.0_152-release-915-b6 x86_64JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.oMac OS X 10.12.4   1 #include

栈-出栈序列正确性分析

问题很简单:在栈的性质下,1~n的数字按顺序入栈,给出它们的出栈序列,判定该序列是否合理. 相比于之前遇到过的“求解所有可行出栈序列”,本问题的复杂度着实降低了不少.不过要把这个过程正确地通过code模拟出来,在逻辑的处理上也需要注意不少细节. 下面先来讲讲处理的方法: 程序输入:n以及给定的出栈序列,出栈序列不妨设为q[n+1],其中q[1]~q[n]顺序保存正确性未知的出栈序列. 由于入栈是按顺序入栈,可以不用额外的数组保存,仅需要一个递增的标志A表示即可.同时,出栈序列也需要一个指针B来保

栈的链式存储结构和入栈出栈操作

参考<大话数据结构>P98~99——栈的链式存储结构. 进栈: 出栈: 举个简单的例子: 代码和解释如下(VS2012测试通过): 1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 typedef string status;//用书上推荐的status返回是否成功,C++中的模板类string比字符数组char[]更方便 6 7 //栈的结点 8 //包含data,和指向下一个结点

两栈共享空间的存储结构和入栈出栈操作

参考<大话数据结构>P95~96——两栈共享存储空间. 当两个栈的需求空间有相反关系时,也就是一个栈增长时,另一个栈在缩短,可以采用两栈共享空间结构.这是针对两个具有相同数据类型的栈的一个设计技巧. 举个简单的例子: 代码和解释如下(VS2012测试通过): 1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 #define MAXSIZE 6 //本例中栈满共6个元素 6 typed

入栈/出栈

栈的push/pop操作 #include<iostream> #include<vector> using namespace std; struct node { int data; node *next; }; struct stack_queue { node *bottom; node *top; }; //入栈 stack_queue *push_stack(stack_queue *ST, int num) { //stack_queue *s=new stack_q

栈、堆内存到底是如何申请的,方法是如何入栈出栈的——内存结构理解学习

Lee出品,转载请注明出处http://blog.csdn.net/hnulwt/article/details/42934365 对于软件开发者而言,理解和熟悉计算机内存知识是很基础的.今天我就来翻翻旧账,回顾看看有哪些点遗漏了,在此共同学习. 提起内存,我们常常想到三个区域: 1,静态区,静态变量 static variables / constant  ,常量,静态变量就存储在静态区域,这个区域比较简单,只需要知道怎么通过地址访问他就行了. 2,堆,也叫堆栈(这里要注意堆栈 和 栈 是不同

编程实现栈的入栈/出栈操作

完整代码如下,其实队栈都只是链表的一种变化而已 #include <stdio.h> #include <stdlib.h> typedef struct student * PNode; typedef struct stacklink * PStack; typedef struct student { int data; PNode next; }Node; typedef struct stacklink { PNode zhandi; PNode top; }Stack;

23 入栈 出栈

分析下列程序输出:string int main() { StackS; char x,y; Initstack(S); x='n';y='g'; Push(S,x);Push(S,'i');Push(S,y); Pop(S,x);Push(S,'r');Push(S,'t');Push(S,x); Pop(S,x);Push(S,' s'); while(!StackEmpty(S)) { Pop(S,y);printf(y); }; Printf(x); } 分析:看完如下的结果即可.补充一