1. 程式人生 > >棧和佇列習題及答案

棧和佇列習題及答案

第三章 棧和佇列

 

一、選擇題

 

1、一個棧的輸入序列為:a,b,c,d,e,則棧的不可能輸出的序列是(   )。

A. a,b,c,d,e              B. d,e,c,b,a           

C. d,c,e,a,b              D. e,d,c,b,a

2、判斷一個迴圈佇列Q(最多n個元素)為滿的條件是(   )。

A. Q->rear==Q->front               B. Q->rear==Q->front+1     

C. Q->front==(Q->rear+1)%n         D. Q->front==(Q->rear-1)%n

3、設計一個判別表示式中括號是否配對的演算法,採用(   )資料結構最佳。

A. 順序表          B. 連結串列           C. 佇列        D.

4、帶頭結點的單鏈表head為空的判定條件是(   )。

A. head==NULL           B. head->next==NULL 

   

C. head->next!=NULL  D. head!=NULL

5、一個棧的輸入序列為:1,2,3,4,則棧的不可能輸出的序列是(   )。

A. 1243          B. 2134       C. 1432        D. 4312      E. 3214

6、若用一個大小為6的陣列來實現迴圈佇列,且當rear和front的值分別為0,3。當從佇列中刪除一個元素,再加入兩個元素後,rear和front的值分別為(   )。

A. 1和5              B. 24       C. 4和2       D. 5和1

7、佇列的插入操作是在(   )。

A. 隊尾               B. 隊頭        C. 佇列任意位置    D. 隊頭元素後

8、迴圈佇列的隊頭和隊尾指標分別為front和rear,則判斷迴圈佇列為空的條件是(   )。

A. front==rear            B. front==0     

C. rear==0             D. front=rear+1

9、一個順序棧S,其棧頂指標為top,則將元素e入棧的操作是(   )。

A. *S->top=e;S->top++;          B. S->top++;*S->top=e;  

C. *S->top=e                    D. S->top=e;

10、表示式a*(b+c)-d的字尾表示式是(   )。

A. abcd+-        B. abc+*d-    C. abc*+d-    D. -+*abcd

11、將遞迴演算法轉換成對應的非遞迴演算法時,通常需要使用(   )來儲存中間結果。

A. 佇列        B.          C. 連結串列           D. 樹

12、棧的插入和刪除操作在(   )。

    A. 棧底         B. 棧頂        C.  任意位置        D. 指定位置

13、五節車廂以編號1,2,3,4,5順序進入鐵路排程站(棧),可以得到(   )的編組。

    A. 3,4,5,1,2           B. 2,4,1,3,5     

C. 35421          D. 1,3,5,2,4

14、判定一個順序棧S(棧空間大小為n)為空的條件是(   )。

A. S->top==0         B. S->top!=0         

C. S->top==n         D. S->top!=n

15、在一個鏈佇列中,front和rear分別為頭指標和尾指標,則插入一個結點s的操作為(   )。

A. front=front->next       B. s->next=rear;rear=s

C. rear->next=s;rear=s;     D. s->next=front;front=s;

16、一個佇列的入隊序列是1,2,3,4,則佇列的出隊序列是(   )。

    A. 1,2,3,4                   B. 4321 

    C. 1,4,3,2                   D. 3,4,1,2

17、依次在初始為空的佇列中插入元素a,b,c,d以後,緊接著做了兩次刪除操作,此時的隊頭元素是(   )。

A. a           B. b              C. c           D. d

18、正常情況下,刪除非空的順序儲存結構的堆疊的棧頂元素,棧頂指標top的變化是(   )。

A. top不變         B. top=0      C. top=top+1      D. top=top-1

19、判斷一個迴圈佇列Q(空間大小為M)為空的條件是(   )。

A. Q->front==Q->rear            B. Q->rear-Q->front-1==M   

C. Q->front+1=Q->rear            D. Q->rear+1=Q->front

20、設計一個判別表示式中左右括號是否配對出現的演算法,採用(   )資料結構最佳。

A. 線性表的順序儲存結構    B. 佇列    C. 棧          D. 線性表的鏈式儲存結構

21、當用大小為N的陣列儲存順序迴圈佇列時,該佇列的最大長度為(   )。

A. N         B. N+1        C. N-1        D. N-2

22、佇列的刪除操作是在(   )。

A. 隊首          B. 隊尾        C. 隊前        D. 隊後

23、若讓元素1,2,3依次進棧,則出棧次序不可能是(   )。

A. 3,2,1        B. 2,1,3     C. 3,1,2         D. 1,3,2

24、迴圈佇列用陣列A[0,m-1]存放其元素值,已知其頭尾指標分別是front和rear,則當前佇列中的元素個數是(   )。

    A. (rear-front+m)%m          B. rear-front+1     

C. rear-front-1             D. rear-front

25、在解決計算機主機和印表機之間速度不匹配問題時,通常設定一個列印資料緩衝區,主機將要輸出的資料依次寫入該緩衝區,而印表機則從該緩衝區中取走資料列印。該緩衝區應該是一個(   )結構。

A. 堆疊        B. 佇列        C. 陣列        D. 線性表

26、棧和佇列都是(   )。

A. 鏈式儲存的線性結構              B. 鏈式儲存的非線性結構          

C. 限制存取點的線性結構           D. 限制存取點的非線性結構

27、在一個鏈佇列中,假定frontrear分別為隊頭指標和隊尾指標,刪除一個結點的操作是(   )。

A. front=front->next        B. rear= rear->next        

C. rear->next=front         D. front->next=rear

28、隊和棧的主要區別是(   )。

A. 邏輯結構不同                    B. 儲存結構不同

C. 所包含的運算個數不同            D. 限定插入和刪除的位置不同

 

二、填空題

1、設棧S和佇列Q的初始狀態為空,元素e1,e2,e3,e4,e5,e6依次通過棧S,一個元素出棧後即進入佇列Q,若6個元素出隊的序列是e2,e4,e3,e6,e5,e1,則棧的容量至少應該是           

答案:3

2、一個迴圈佇列Q的儲存空間大小為M,其隊頭和隊尾指標分別為front和rear,則迴圈佇列中元素的個數為:          

答案:(rear-front+M)%M

3、在具有n個元素的迴圈佇列中,隊滿時具有          個元素。

答案:n-1

4、設迴圈佇列的容量為70,現經過一系列的入隊和出隊操作後,front為20,rear為11,則佇列中元素的個數為          

答案:61

5、已知迴圈佇列的儲存空間大小為20,且當前佇列的頭指標和尾指標的值分別為8和3,且該佇列的當前的長度為_______。

三、判斷題

1、棧和佇列都是受限的線性結構。P

2、在單鏈表中,要訪問某個結點,只要知道該結點的地址即可;因此,單鏈表是一種隨機存取結構。O

3、以連結串列作為棧的儲存結構,出棧操作必須判別棧空的情況。P

 

 

四、程式分析填空題

1、已知棧的基本操作函式:

 

    int InitStack(SqStack *S); //構造空棧

    int StackEmpty(SqStack *S);//判斷棧空

    int Push(SqStack *S,ElemType e);//入棧

    int Pop(SqStack *S,ElemType *e);//出棧

 

函式conversion實現十進位制數轉換為八進位制數,請將函式補充完整。

void conversion(){

    InitStack(S);

    scanf(“%d”,&N);

    while(N){

             1           ;

       N=N/8;

}

while(      2       ){

    Pop(S,&e);

    printf(“%d”,e);

}

}//conversion

答案:(1Push(S,N%8)       (2)!StackEmpty(S)

 

2、寫出演算法的功能。

int  function(SqQueue *Q,ElemType *e){

    if(Q->front==Q->rear)

       return ERROR;

    *e=Q->base[Q->front];

    Q->front=(Q->front+1)%MAXSIZE;

    return OK;

}

3、閱讀演算法f2,並回答下列問題:

(1)設佇列Q=(1,3,5,2,4,6)。寫出執行演算法f2後的佇列Q;

(2)簡述演算法f2的功能。

 

void  f2(Queue *Q){

   DataType   e;

   if (!QueueEmpty(Q)){

     e=DeQueue(Q);

     f2(Q);

     EnQueue(Q,e);

   }

}

答案:(16,4,2,5,3,1                2)將佇列倒置

 

 

五、綜合題

1、假設以帶頭結點的迴圈連結串列表示佇列,並且只設一個指標指向隊尾結點,但不設頭指標,請寫出相應的入佇列演算法(用函式實現)。

答案:void EnQueue(Lnode *rear, ElemType e)

  {  Lnode *new;

     New=(Lnode *)malloc(sizeof(Lnode));

If(!new) return ERROR;

new->data=e; new->next=rear->next;

rear->next=new; rear =new;

  }

2、已知Q是一個非空佇列,S是一個空棧。編寫演算法,僅用佇列和棧的ADT函式和少量工作變數,將佇列Q的所有元素逆置。

棧的ADT函式有:

 

void makeEmpty(SqStack s);  置空棧

void push(SqStack s,ElemType e);   元素e入棧

ElemType pop(SqStack s); 出棧,返回棧頂元素

int isEmpty(SqStack s);  判斷棧空

佇列的ADT函式有:

void enQueue(Queue q,ElemType e);  元素e入隊

ElemType deQueue(Queue q);  出隊,返回隊頭元素

int isEmpty(Queue q);    判斷隊空

答案:void QueueInvent(Queue q)

  {  ElemType x;

     makeEmpty(SqStack s);

while(!isEmpty(Queue q))

{x=deQueue(Queue q);

push(SqStack s, ElemTypex);}

while(!isEmpty(SqStack s))

{x=pop(SqStack s);

enQueue(Queue q, ElemType x);}

  }

 

3、對於一個棧,給出輸入項A,B,C,D,如果輸入項序列為A,B,C,D,試給出全部可能的輸出序列。

答案:出棧的可能序列:

  ABCD  ABDC  ACDB  ACBD  ADCB  BACD  BADC  BCAD  BCDA

  CBDA  CBAD  CDBA  DCBA