【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++) /*读入需要驶出的

题目

【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+l;j <=state [i];j++){

Push(&station, j);

}

else{ /*当栈为空时*/

begin=maxNo;

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

Push(&station, j);

maxNo= (5) ;

printf("OK");

return 0;


相似考题
参考答案和解析
正确答案:
(1)InitStack(&station)
(2)!IsEmpty(station)
(3)state[i]Top(station)
(4)Top(station)
(5)j
更多“【C程序】#include&lt;stdio.h&gt; /*此处为栈类型及其基本操作的定义,省略*/ int main(){ STACK ”相关问题
  • 第1题:

    阅读下列说明和C代码,将应填入(n)处的字句写在对应栏内。

    【说明】

    栈(Stack)结构是计算机语言实现中的一种重要数据结构。对于任意栈,进行插入和删除操作的一端称为栈顶(Stock Top),而另一端称为栈底(Stock Bottom)。栈的基本操作包括:创建栈(NewStack)、判断栈是否为空(IsEmpty)、判断栈是否已满(IsFull)、获取栈顶数据(Top)、压栈/入栈(Push)、弹栈/出栈(Pop)。

    当设计栈的存储结构时,可以采取多种方式。其中,采用链式存储结构实现的栈中各数据项不必连续存储(如下图所示)。

    以下C代码采用链式存储结构实现一个整数栈操作。

    【C代码】

    typedef struct List {

    int data; //栈数据

    struct List* next; //上次入栈的数据地址

    }List;

    typedef struct Stack{

    List* pTop; //当前栈顶指针

    }Stack;

    Stack* NewStack() {return (Stack*) calloc(1/sizeof(Stack));}

    int IsEmpty(Stack* S){//判断栈S是否为空栈

    if((1))return 1;

    return 0;

    }

    int Top(Stack* s){//获取栈顶数据。若栈为空,则返回机器可表示的最小整数

    if(IsEmpty(S))return INT_ MIN;

    return (2);

    }

    void Push(Stack* S,int theData) {//将数据theData压栈

    List* newNode;

    newNode=(List*)calloc(1/sizeof (List));

    newNode->data=theData;

    newNode->next=S->pTop;

    S->pTop=(3);

    }

    void Pop(Stack* S) {//弹栈

    List* lastTop;

    if(IsEmpty(S) ) return;

    lastTop=S->pTop;

    S->pTop=(4);

    free(lastTop);

    }

    define MD(a) a<<2

    int main(){

    int i;

    Stack* myStack;

    myStack= NewStack();

    Push(myStack,MD(1));

    Push(myStack,MD(2));

    Pop(myStack);

    Push(myStack,MD(3)+1);

    while( !IsEmpty(myStack) ){

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

    Pop(myStack);

    }

    return 0;

    }

    以上程序运行时的输出结果为:(5)


    正确答案:(1)S==NULL||S->pTop==NULL (2)S->pTop->data (3)newNode (4)S->pTop->next或lastTop->next (5)244
    (1)S==NULL||S->pTop==NULL (2)S->pTop->data (3)newNode (4)S->pTop->next,或lastTop->next (5)244 解析:本题考查基本程序设计能力。
    堆栈是软件设计中常使用的一种经典数据结构,题目给出的操作都是任何堆栈都具有的基本操作。堆栈的存储结构通常采用数组或链表形式,但无论采用哪种存储结构,整体上呈现的是后进先出的特点,即后进入堆栈的元素先出栈。题目中给出的结构体 Stack仅包含一个指向栈顶元素的指针(栈顶指针),当且仅当堆栈中没有元素时,该指针应为NULL。当向堆栈中增加元素时,首先需要动态创建该元素的存储区,并且栈顶指针指向该元素。当元素出栈时,栈顶指针则指向出栈元素的紧前一个元素。结构体List表示栈中元素,包含对应的数据和指向紧上次入栈的元素指针next,对于第1个入栈的元素,指针next为NULL,而其他元素中的指针next一定不为NULL。
    C语言中,如果用一个整数型表达式表示条件判定语句的话,该表达式的值为。则表示假,非0表示真。从给定程序代码可以看出,对于函数IsEmpty,若其返回值为0则表示堆栈非空,否则表示堆栈为空。因此,对于空(1),必须填写可表示堆栈为空的判定语句:S=NULL||S->p)Top==NULL,这2个条件中只要有1个条件满足,则表明堆栈S为空。对于空(2),此时需要返回栈顶元素中的数据,而栈顶元素为S->pTop,所以对应的数据应该为S->pTop->data。
    对于压栈操作Push,在为新元素获取存储空间后,必须调整堆栈的栈顶指针S->pTop指向新元素的存储区,即S->pTop=newNode。对于弹栈操作Pop,弹出栈顶元素lastTop后,需要调整栈顶指针,使其指向被弹出元素的下一个元素,即S->pTop=S->pTop->next,或S->pTop=lastTop->next。
    对于main函数中宏MD(x),在程序预编译时会按字符替换为“x2”。所以在main函数中,首先入栈的元素为“12”,即整数4,第2个入栈的元素为“22”,即整数8,其次将8弹出,然后再将“32+1”入栈,C语言中“+”优先级高于“”,所以此时入栈者为整数24,而此时堆栈中有2个元素,其中栈顶元素为24,下一元素为4。最后,若堆栈非空,则循环完成显示栈顶元素的值、弹出栈顶元素的操作,直至堆栈为空。所以程序执行时的输出内容为“244”。

  • 第2题:

    (12)假定栈用顺序的方式存储,栈类型 stack定义如下:

    TYPE stack=RECORD

    A:ARRAY[l..m0] OF datatype;

    t:O..m0;

    END;

    下面是栈的一种基本运算的实现:

    PROCEDURE xxxx(VAR s:satack);

    BEGIN

    IF s.t=0

    THEN print(‘underflow’)

    ELSE s.t:=s.t-1;

    END;

    请问这是栈的哪一种基本运算?

    A) 栈的推入

    B)栈的弹出

    C)读栈顶元素

    D)将栈置为空栈


    正确答案:A

  • 第3题:

    int main() { } 其中的int含义是_____。

    A.main函数的返回值类型

    B.定义变量类型为int

    C.定义常量类型为int

    D.强制返回值为0


    A

  • 第4题:

    试题七(共 15 分)

    阅读以下说明和C程序,将应填入 (n) 处的字句写在答题纸的对应栏内。

    【说明】

    现有 n(n < 1000)节火车车厢,顺序编号为 1,2,3,...,n,按编号连续依次从 A方向的铁轨驶入,从 B 方向铁轨驶出,一旦车厢进入车站(Station)就不能再回到 A方向的铁轨上;一旦车厢驶入 B 方向铁轨就不能再回到车站,如图 7-1所示,其中 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[i]; j++){

    Push(&station, j);

    }

    maxNo = (5) ;

    }

    }

    printf("OK");

    return 0;

    }


    正确答案:


    试题七 分析
      本题考查栈数据结构的应用和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端)正待进入的车厢(即比栈顶车厢号正好大l)开始,直到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”而结束。
    试题七 参考答案(共15分,各3分)
    (1)InitStack(&station)
    (2)!IsEmpty(station)
    (3)state[i]Top(station)
    (4)Top(station)
    (5)j

  • 第5题:

    开始往输入串末尾和分析栈stack中放“#”,然后把文法开始符号压栈。预测分析程序总是按_________和________。

    A.stack栈顶符号X 最后的输入符号b

    B.stack栈顶符号X 当前输入符号a

    C.stack栈尾符号X 当前输入符号a

    D.stack栈尾符号X 最后的输入符号b


    stack栈顶符号X、当前输入符号a