判断栈输出序列的合法性

本文档详细阐述了一个关于栈的应用问题:如何判断一个输入序列是否可以通过栈转换为给定的输出序列。涉及需求分析、详细设计以及用户手册,展示了使用C语言实现的栈操作算法,包括初始化、空栈检查、元素存取、压栈和弹栈,以验证序列变换的可行性。
摘要由CSDN通过智能技术生成

实习报告

题目:判断栈输出序列的合法性。

需求分析

(1)用户从键盘上输入序列m1, m2, …, mn(这个序列是序列1, 2, …, n的一个置换。也就是说,输出序列一定包含1, 2, …, n中的任意元素,并且所有元素只出现一次),要求还原出输入序列1, 2, …, n。然后判断通过一个栈结构能不能把输入序列1, 2, …, n变换成输出序列m1, m2, …, mn。

(2)输入第一行是一个整数n在区间[1, 20]之中,表示测试用例的多少。对第i个测试用例,第一行是一个整数mi,表示第i个测试用例中共有多少个整数,mi在区间[1, 50]中。后面紧跟的mi行中,每一行是一个整数,每个数在区间[1, mi]之中。

(3)输出对于n个测试用例,共输出n行,每一行中只有一个字母:大写的T或者大写的F。大写的T表示从小到大依次输入的一个序列能够通过栈变换成测试用例给定的序列;大写的F表示从小到大依次输入的一个序列不能够通过栈变换成测试用例给定的序列。

详细设计

#include<stdio.h>

#include<stdlib.h>

#include<malloc.h>

#define TRUE 1

#define FALSE 0

#define OK 1

#define ERROR 0

#define INFEASIRLE -1

#define OVERFLOW -2

#define STACK_INIT_SIZE 100//存储空间初始分配量 

#define STACKINCREMENT 10//存储空间分配增量 

typedef int Status;

typedef int SElemType;

typedef struct{

        SElemType *base;

        SElemType *top;

        int stacksize;

        }SqStack;

Status InitStack(SqStack *S){

       S->base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));

       if(!S->base)exit(OVERFLOW);

       S->top=S->base;

       S->stacksize=STACK_INIT_SIZE;

       return OK;

       }//InitStack

Status StackEmpty(SqStack s){

       if(s.top==s.base)return TRUE;

       else return FALSE;

       }

Status GetTop(SqStack S,SElemType *e){

       if(S.top==S.base)return ERROR;

       *e=*(S.top-1);

       return OK;

       }//GetTop

Status Push(SqStack *S,SElemType e){

       if(S->top-S->base>=S->stacksize){

           S->base=(SElemType*)realloc(S->base,(S->stacksize+STACKINCREMENT)*sizeof(SElemType));

           if(!S->base)exit(OVERFLOW);

           S->top=S->base+=STACKINCREMENT;              

           }

           *S->top++=e;

           return OK;

       }//Push

Status Pop(SqStack *S,SElemType *e){

       if(S->top==S->base)return ERROR;

       *e=*--S->top;//指针 指在内容上面的存储单元

       return OK;

       }//Pop

Status Length(SqStack S){

      int i=0;

      for(i;S.top!=S.base;S.top--)i++;

      return i;

      }

int main(int argc, char *argv[])

{  int a[100];SqStack s[100];int b[100];

  int i,j,k,m=0,e1,e2;

  int n1,n2;//栈的个数  

  printf("请输入栈的组数:");

  scanf("%d",&n1); 

  for(i=0;i<n1;i++)

{

  InitStack(&s[i]);

  printf("请输入%d个栈出来的元素个数:",i+1);

  scanf("%d",&n2);

  printf("请输入出栈的顺序:");

  for(k=0;k<n2;k++)

  {

   scanf("%d",&b[k]);

                    } 

  for(j=1;j<=n2;j++)

     {

         Push(&s[i],j);

         while(!StackEmpty(s[i]))

        {

         GetTop(s[i],&e1);

                if(e1==b[m])

               {

                Pop(&s[i],&e2);m++;

               }

                else break;

        }

     }

     m=0;

}

  for(i=0;i<n1;i++)

{

  if(StackEmpty(s[i]))printf("第%d个栈的出栈顺序是T\n",i+1);

      else printf("第%d个栈的出栈顺序是F\n",i+1);

}  

  system("PAUSE");

  return 0;

}

用户手册

    对示例输入和示例输出数据的解释

第一行输入是3,这表明,一共有3组输入,即3个测试用例。

第1组输入的第一行是3,这表明,它后面要跟3个整数。它后面的3个整数分别是3、1、2。由于从顺序输入1、2、3不能通过栈变换得到3、1、2,因此第1个测试用例的结果应该是F。

第2组输入的第一行是2,这表明,它后面要跟2个整数。它后面的2个整数分别是2、1。由于从顺序输入1、2能够通过栈变换得到2、1,因此第2个测试用例的结果应该是T。

第3组输入的第一行是4,这表明,它后面要跟4个整数。它后面的4个整数分别是2、1、4、3。由于从顺序输入1、2、3、4能够通过栈变换得到2、1、4、3,因此第3个测试用例的结果应该是T。

测试结果

示例输入

3

3

3

1

2

2

2

1

4

2

1

4

3

示例输出  F T T

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

免费范文

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值