问题 问答题

阅读以下说明和C程序,在(n)处填入适当的字句。

[说明]

现有n(n<1000)节火车车厢,顺序编号为1,2,3,…,n,按编号连续依次从A方向的铁轨驶入,从B方向铁轨驶出,一旦车厢进入车站(Station)就不能再回到A方向的铁轨上;一旦车厢驶入B方向铁轨就不能再回到车站,如图8.11所示,其中Station为栈结构,初始为空且最多能停放1000节车厢。

下面的C程序判断能否从B方向驶出预先指定的车厢序列,程序中使用了栈类型STACK,关于栈基本操作的函数原型说明如下。

void InitStack(STACK *s):初始化栈。

void Push(STACK*s,int e):将一个整数压栈,栈中元素数目增1。

void Pop (STACK *s):栈顶元素出栈,栈中元素数目减1。

int Top (STACK s):返回非空栈的栈顶元素值,栈中元素数目不变。

int IsEmpty (STACK s):若是空栈则返回1,否则返回0。

[C程序]

#include<stdio.h>

/*此处为栈类型及其基本操作的定义,省略*/

int main()

STACK station;

int state [1000];

int n; /*车厢数*/

int begin,i,j,maxNo; /*maxNo为A端正待入栈的车厢编号*/

printf("清输入车厢数:");

scanf("%d",&n);

printf("请输入需要判断的车厢编号序列(以空格分隔):");

if(n<1=return-1;

for(i=0; i<n; i++) /*读入需要驶出的车厢编号序列,存入数组state[]*/

scanf("%d",&state [i]);

(1) ; /*初始化栈*/

maxNo=1;

for(i:0;i<n;)( /*检查输出序列中的每个车厢号state [i]是否能从栈中获取*/

if( (2) )( /*当栈不为窄时*/

if (state[i]=Top(station)) /*栈顶车厢号等于被检查车厢号*/

printf( "%d",Top(station));

Pop(&station);i++;

else

if ( (3) )

printf( "error\n");

return 1;

else

begin= (4)

for(j=begin+1;j<=state [i];j++)

Push (&station, j);

else /*当栈为空时*/

begin=maxNo;

for(j=begin; j<=state [il; j++)

Push (&station, j);

maxNo= (5)

printf("OK");

return 0;

答案

参考答案:

(1) InitStack(&station)

(2) !IsEmpty(station)

(3) state[i]<Top(station)

(4) maxNo-1

(5) j

解析:

[要点解析] 该题是一个C语言描述的数据结构试题,考查的是数据结构当中的“栈”。解答本题需要对栈有基本的了解,如栈有什么特点,入栈操作与出栈操作分别是怎么进行的。栈结构的具体实现主要有两种方式:顺序栈与链栈。顺序栈是用数组来模拟栈,而链栈是用链表方式来实现栈。本题所使用的数据结构为比较容易的顺序栈。

根据题意,要求程序判断能否从B方向驶出预先指定的车厢序列。对于第(1)空和第(2)空,是栈的基本操作:初始化栈和判断栈是否为空,非常简单,分别填:InitStack(&station)和!IsEmpty(station)。由于栈是先进后出的,因此state[i]的值不可能小于当前栈顶的值,因此需进行出错处理,所以第(3)空填state[i]<Top(station)。如果栈项车厢号不等于被检查车厢号,则压入新的车厢号至栈项,所以第(4)空填maxNo-1。maxNo为A端正待入栈的车厢编号,此时A端正待入栈的车厢编号为j,第(5)空显然为j。

填空题
单项选择题