问答题 阅读以下说明和C程序,将应填入空白处的字句。
[说明]
现有n(n<1000)节火车车厢,顺序编号为1、2、3、…、n,按编号连续依次从A方向的铁轨驶入,从B方向铁轨驶出,一旦车厢进入车站(Station)就不能再回到A方向的铁轨上;一旦车厢驶入B方向铁轨就不能再回到车站,如图所示,其中Station为栈结构,初始为空且最多能停放1000节车厢。
【正确答案】
【答案解析】InitStack(&station)
!IsEmpty(station)
state[i]<Top(station)
Top(station)
j 本题考查栈数据结构的应用和C程序设计基本能力。
栈的运算特点是后进先出。在本题中,入栈序列为1、2、…、n-1、n,出栈序列保存在state[]数组中,state[0]记录出栈序列的第1个元素,state[1]记录出栈序列的第2个元素,以此类推。程序采用模拟元素入栈和出栈的操作过程来判断出栈序列是否恰当。需要注意的是,对于栈,应用时不一定是所有元素先入栈后,再逐个进行出栈操作,也不一定是进入一个元素紧接着就出来一个元素,而是栈不满且输入序列还有元素待进入就可以进栈,只要栈不空,栈顶元素就可以出栈,从而使得唯一的一个入栈序列可以得到多个出栈序列。当然,在栈中有多个元素时,只能让栈顶的元素先出栈,栈中其他的元素能从顶到底逐个出栈。本题中入栈序列和出栈序列的元素为车厢号。
第1空处对栈进行初始化,根据题干中关于栈基本操作的说明,调用InitStack初始化栈,由于形参是指针参数,因此实参应为地址量,即应填入Initstack(&station)。
当栈不空时,就可以令栈顶车厢出栈,第2空处应填入!IsEmpty(station)。
栈顶车厢号以Top(station)表示,若栈顶车厢号等于出栈序列的当前车厢号state[i],说明截至到目前为止,出栈子序列state[0]~state[i]可经过栈运算获得。由于进栈时小编号的车厢先于大编号的车厢进入栈中,因此若栈顶车厢号大于出栈序列的当前车厢号state[i],则对于state[i]记录的车厢,若它还在栈中,则此时无法出栈,因为它不在栈顶,所以出错,若它已先于当前的栈顶车厢出栈,则与目前的出栈序列不匹配,仍然出错,因此第3空处应填入state[i]<Top(station)。
若栈顶车厢号小于出栈序列的当前车厢号state[i],则说明state[i]记录的车厢还没有进入栈中,因此从入栈序列(A端)正待进入的车厢(即比栈顶车厢号正好大1)开始,直到state[i]记录的车厢号为止,这些车厢应依次进入栈中。程序中用以下代码实现此操作。
for(j=begin+1; j<=state[i]; j++){
Push(&station, j);
}
显然,begin应获取栈顶车厢号的值,即第4空处应填入Top(station)。
还有一种情况,就是待考查的出栈序列还没有结束而栈空了,则说明需要处理入栈序列,使其车厢入栈。程序中用maxNO表示A端正待入栈的车厢编号,相应的处理如下面代码所示。
begin=maxNO;
for(j=begin; j<=state[i]; j++){
Push(&Station, j);
}
接下来,A端正待入栈的车厢编号等于j或state[i]+1,即空(5)处应填入j或state[i]+1。
如果驶出的车厢编号序列是经由栈获得的,则程序运行时输出该序列及字符串OK,否则输出error而结束。