-->
当前位置:首页 > 题库 > 正文内容

函数题:初始化顺序栈【有题解报告】

Luz3年前 (2022-05-27)题库1296
本题要求实现顺序栈的初始化。注意:形参S是被初始化的顺序栈指针的指针。

而本程序其他部分功能(不必同学们实现):输入数据,以-1结束输入,所有数据与5对比,大于5入栈,再依次出栈,将出栈数据放入数组中,再从数组后方依次向前打印数据。例如输入1 2 3 4 5 6 7 8 9 -1。输出为6 7 8 9。

### 函数接口定义:
c
初始化顺序栈
int InitSqStack(SqStack **S);


### 裁判测试程序样例:
c
#include <stdio.h>
#include <malloc.h>
/*栈中允许存储的元素的最大个数*/
#define STACKSIZE 10
typedef int DataType;
typedef struct
{
DataType items[STACKSIZE];
/*存放栈中元素的一维数组*/
int top; /*用来存放栈顶元素的下标*/
}SqStack;

/* 【 本题要求函数-初始化顺序栈 】*/
int InitSqStack(SqStack **S);

int SqStackEmpty(SqStack S)
{/* S为顺序栈 */
if( S.top == -1 )
return 1;
else
return 0;
}

int SqStackPush( SqStack *S, DataType e )
{
if ( S->top == STACKSIZE-1)
return 0; /*栈已满*/
S->top++;
S->items[S->top]=e;
return 1;
}

int SqStackPop(SqStack *S, DataType *e)
{ /* 将栈S的栈顶元素弹出,放到e所指的存储空间中 */
if ( S->top == -1 ) /* 栈为空 */
return 0;
*e = S->items[S->top]; /* 将栈顶元素带回来 */
S->top--; /* 修改栈顶指针 */
return 1;
}

int main( )
{
int list[STACKSIZE];//定义一个数组,用来存放栈中弹出的数据
SqStack* S1;
int X,count=0;
InitSqStack(&S1);//初始化S1

int input=0;
while(1)
{
scanf("%d",&input);
if(input==-1)
break;
if(input>5&& S1->top<=STACKSIZE-1)
SqStackPush(S1,input);

}

while(S1->top!=-1)
{
SqStackPop(S1,&X);
list[count]= X;
count++;
}
for(count; count>0;count--)
printf("%d ",list[count-1]);
return 0;
}
/* 请在这里填写答案 */


### 输入样例:

在这里给出一组输入。例如:

in
1 2 3 4 5 6 7 8 9 -1



### 输出样例:

在这里给出相应的输出。例如:

out
6 7 8 9








答案:若无答案欢迎评论

函数的接口定义为
int InitSqStack(SqStack **S) // 初始化顺序栈
首先看看main()函数里面怎么调用的:

SqStack* S1;

InitSqStack(&S1);

要求大家完成的子函数的形参为InitSqStack是SqStack **S,即为SqStack类型指针的指针(总而言之是个指针),所以初始化的时候,

【首先】需要使用malloc函数为这个指针开辟空间。
关键是怎么使用malloc函数,我上课讲过,两步走:

![顺序栈的初始化【参考】.png](~/32070144-3bfa-4a36-8b06-818acfea1dd5.png)


第一步,挖空间——多大——sizeif(SqStack);即 malloc(sizeof(SqStack));

第二步,贴标签,通过第一步的调用,我们可以看到是返回的SqStack的指针类型,但是我们子函数的形参是SqStack类型指针的指针,中间还差了一层指针,为此,我们需要通过(*S)来“剥除”一层指针,也就是通过(*S)得到的就是SqStack的指针类型变量了。

所以贴标签这一步,应该是 (*S) = (SqStack *)malloc(sizeof(SqStack));

【其次】顺序栈的初始状态应该为空,怎让它为空呢?看看本题中其他函数是怎么判断栈空的,如SqStackEmpty()函数里,

if( S.top == -1 )

return 1; // 栈为空

所以我们此处初始化的时候,需要置top为-1,可是应该怎么写这个置-1语句呢?

(*S)->top = -1 ;

还是

S->top = -1;

【最后】因为接口定义了int型的返回值,所以在初始化顺序栈结束的最后之处,应该定义一个返回值,即return 某int值。

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。