栈之出栈序列合法性

#include<stdio.h>
#include<string.h>
#define MaxSize 100
typedef int DataType;
typedef struct
{
    DataType stack[MaxSize];
    int top;
}SeqStack;
void StackInitiate(SeqStack *s)//初始化
{
    s->top=0;
}
int StackNotEmpty(SeqStack s)//非空否
{
    if(s.top<= 0) return 0;
    else return 1;
}
int StackPush(SeqStack *s,DataType x)//入栈
{
    if(s->top>=MaxSize)
    {
        return 0;
    }
    else
    {
        s->stack[s->top]=x;
        s->top++;
        return 1;
    }
}
int StackPop(SeqStack *s,DataType *d)//出栈
{
    if(s->top<=0)
    {
        return 0;
    }
    else
    {
        s->top--;
        *d=s->stack[s->top];
        return 1;
    }
}
int StackTop(SeqStack s,DataType *d)//取栈顶数据
{
    if(s.top<=0)
    {
        return 0;
    }
    else
    {
        *d=s.stack[s.top-1];
        return 1;
    }
} 

 main()
{
    SeqStack l;
    int i,n=0,j,k,ru,chu[100],t,first=1;
    StackInitiate(&l);
    while(scanf("%d",&chu[n])!=EOF)
    {
        n++;
    }
    i=0,ru=1;
    while(i<n)
    {
        if(!StackNotEmpty(l))
        {
            StackPush(&l,ru);
            ru++;
        }
        else
        {
            StackTop(l,&t);
            if(t==chu[i])
            {
                StackPop(&l,&t);
                i++;
            }
            else if(t<chu[i])
            {
                StackPush(&l,ru);
                ru++;
            }
            else
            {
                first=0;
                break;
            }

        }
    }
    if(first)
    printf("1");
    else
    printf("0");
} 
时间: 2024-10-12 19:24:58

栈之出栈序列合法性的相关文章

判断栈的出栈顺序合法性

栈的出栈顺序合法性是指给定一系列元素,如1 - N,按照从小到大的方式入栈,每个元素的出栈时机不定.题目给定一个出栈顺序,我们来判断这个出栈顺序有没有可能发生. 比如对[1,2,3,4,5,6,7,8,9]: [1,2,3,4,5,6,7,8,9]是一个合法出栈序列 [9,8,7,6,5,4,3,2,1]也是一个合法序列 [4,5,3,2,7,6,1,8,9]也是一个合法序列 [3,4,5,1,2,9,8,7,6]就是一个非法序列 判断方法有两种,一种是对每一个值,其后所有小于它的值的数是一个降

N个数依次入栈,出栈顺序有多少种?

对于每一个数来说,必须进栈一次.出栈一次.我们把进栈设为状态‘1’,出栈设为状态‘0’.n个数的所有状态对应n个1和n个0组成的2n位二进制数.由于等待入栈的操作数按照1‥n的顺序排列.入栈的操作数b大于等于出栈的操作数a(a≤b),因此输出序列的总数目=由左而右扫描由n个1和n个0组成的2n位二进制数,1的累计数不小于0的累计数的方案种数. 在2n位二进制数中填入n个1的方案数为C(2n,n),不填1的其余n位自动填0.从中减去不符合要求(由左而右扫描,0的累计数大于1的累计数)的方案数即为所

C++中栈的出栈,入栈规则:A,B,C,D,E

考题: 栈底至栈顶一次存放元素 ABCD 在第五个元素E入栈之前  栈中元素可以出栈,则出栈序列可能是_____a d___________. a.  ABCED b.  DBCEA   c.  CDABE   d.  DCBEA 分析: 1.假定进栈序列是从小到大排练的(即A<B<C<D<E),则出栈序列中不可能有  “大小中”这种序列,因为在“大数”出栈后,在栈中“中数”是在“小数”上面的,所以只能是先出“中数”再出“小数”2.出栈序列中如包含下列序列则是错误的:CAB,DAB

栈初始化,入栈,出栈功能的实现

1 ////////////////////////////////////////////////////////// 2 // stack.cpp 3 // 4 // author:Leetao 5 ////////////////////////////////////////////////////////// 6 // 简介: 7 // 线性表的实现 8 ////////////////////////////////////////////////////////// 9 /** 1

【数据结构】用C++编写栈及基本操作(包括入栈,出栈,获得栈顶,摧毁,清空等等)

//[数据结构]用C++编写栈及基本操作(包括入栈,出栈,获得栈顶,摧毁,清空等等) //头文件 #ifndef _SEQ_STACK_ #define _SEQ_STACK_ #include <iostream> using namespace std; template <class Type> class SeqStack { public: SeqStack(size_t sz=INIT_SIZE) { capacity = sz > INIT_SIZE ? sz

数据结构学习——栈的出栈次序及次序种类

学过数据结构的程序猿应该都清楚,栈是一种先入后出,后入先出(LIFO)的表.即插入和删除都只能在一个位置上进行,即栈顶位置.对栈的基本操作有Push(入栈)和Pop(出栈).在一般软件研发的笔试中,就会经常遇到关于入栈次序一定时,出栈次序有哪些?共有几种? 其实,此处只要了解一下卡特兰数的算法结构,参见: http://baike.baidu.com/link?url=T7ZR16yiaWKNQPhem12nYJS56PqVeizOPnsGhBlynVFEy6JbB8CrMYKIetkvYm4Q

栈(出栈序列)

已知自然数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个正整数,以空格隔开,为出栈序列: 输入数据的末尾以一

栈的出栈序列个数

有n个数$1,2,3,4,...n$依次入栈,不必等全部的数入完再出,问有多少个出栈顺序? 解: 设问题答案是$f(n)$ ,$f(1)=1,f(2)=2$ 分n种情况: 1最后出来: $ f(n)$ k最后出来:$f(k-1)*f(n-k)$ 所以  $$f(n+1)=f(n)+f(n-1)f(1)+f(n-2)f(2)+......f(k)f(n-k)+......f(n)$$ 这是Catalan数的递推式: 得$$f(n)=\frac{C^{n}_{2n}}{n+1}$$ 原文地址:htt

栈的操作(创建,入栈,出栈,清空,遍历等等)

#include<stdio.h> #include<malloc.h> #include<stdlib.h> typedef struct Node { int data; struct Node *pNext; }NODE,*PNODE; typedef struct Stack { PNODE pTop; PNODE pBottom; }STACK,*PSTACK; void init(PSTACK pS); void push (PSTACK pS,int va