实习报告
题目:判断栈输出序列的合法性。
需求分析
(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