函数题:初始化顺序栈【有题解报告】
本题要求实现顺序栈的初始化。注意:形参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函数,我上课讲过,两步走:

第一步,挖空间——多大——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值。
而本程序其他部分功能(不必同学们实现):输入数据,以-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函数,我上课讲过,两步走:

第一步,挖空间——多大——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值。