您的位置:首页 > 理论基础 > 数据结构算法

数据结构(线性结构习题)Problem C: 下车的顺序

2016-12-25 23:36 295 查看

Problem C: 下车的顺序

Time Limit: 1 Sec  Memory Limit:
2 MB
Submit: 3642  Solved: 1353

[Submit][Status][Web
Board]

Description

很多高校都有两个或多个校区,为了方便教师和学生往返于这两个校区,学校在两个校区之间开通了校车。用于通勤的校车只有一个门,上、下车均需要通过此门,且校车的容量上限为c。车内过道很窄,只能容纳一个人通过,为了运送更多的人,车内中间过道上设有活动、可折叠的坐椅,如果有人站在或者坐在中间过道上,任何人都无法通过,是所谓一夫当关万夫莫开。在非常拥挤的情况下,司机通常让先上的人尽量坐在后排位置,这样从后往前一排排坐过来,最先上的人坐最后面,最后上的在最前面。当车到达目的地后,下车时,只能是靠近车门的人先下,这样一排排往后,最后一排的人最后下车。请编程模拟乘坐通勤车的情景:先上的人最后下来。每个乘客用一个编号来表示,用户给出一组乘客上车的编号(即乘客的等车次序),程序输出下车编号顺序。

Input

输入第一行为测试数据组数。每组测试数据第1行输入两个整数n(1<=n<=100)、c(1<=c<=20000)分别代表停车的次数和校车容量,接下来有n行,每一行第一个数m表示有人上车还是下车(0 <= m <= 200):(1)当m=0时,后面紧跟着输入一个非负整数k,表示此时有k个人下车;(2)当m>0时,后面输入m个正整数,表示等待上车的人的编号,可能有人因车满而无法上车。

Output

对每组测试数据,第1行输出数据组数,然后对每一个m为0输出一行k个数的编号(即每次输出都有谁下车了),每两个数中间用空格隔开。

Sample Input

1
4 10
6 1 2 3 4 5 6
0 3
2 7 8
0 3


Sample Output

Case #1:
6 5 4
8 7 3


HINT

考察知识点:栈, 时间复杂度O(n),空间复杂度O(n)

Append Code

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define NULL 0
#define OVERFLOW -1
#define ERROR 0
#define OK 1
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef int Status;
//typedef char  SElemType;

typedef int SElemType;

typedef struct{
SElemType *base;
SElemType *top;
int stacksize;
}SqStack,*SStack;

Status InitStack(SqStack &S,int c){
S.base=(SElemType*)malloc(c*sizeof(SElemType));
if(!S.base) exit(OVERFLOW);//储存分配失败
S.top = S.base;
S.stacksize = c;
return OK;
}//复杂度:O(1)

//入栈
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+S.stacksize);//重新使得S.top指向栈顶,因为realloc
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;//top指向带插入的位置
return OK;
}

Status Pop(SqStack &S,SElemType &e){
//若栈不空则栈顶元素出栈并用e带回其值
if(S.top==S.base) return ERROR;
e = *(S.top-1);
S.top--;
return OK;
}

//判断栈是否为空栈
Status StackEmpty(SqStack &S){
if(S.top=S.base)
return 1;
else
return 0;
}

Status DestroyStack(SqStack &S){
//销毁栈S
free(S.base);
S.base=NULL;
S.top=NULL;
S.stacksize=0;
return OK;
}

int main()
{
int t;
scanf("%d",&t);
int num = 0;
while(t--){
printf("Case #%d:",++num);
printf("\n");
int n,c,m;
scanf("%d",&n);
scanf("%d",&c);
SqStack S;
InitStack(S,c);
SElemType e;
while(n--){
scanf("%d",&m);
if(m==0){
int aa;
int first=0;
scanf("%d",&aa);
while(aa--){
Pop(S,e);
if(first==0){
printf("%d",e);
first++;

}
else{
printf(" %d",e);
}
}
printf("\n");
}
else{
for(int i =0;i<m;i++){
scanf("%d",&e);
Push(S,e);
}
}
}
DestroyStack(S);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: