棧和佇列習題及答案
第三章 棧和佇列
一、選擇題
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. 2和4 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. 3,5,4,2,1 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. 4,3,2,1
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、在一個鏈佇列中,假定front和rear分別為隊頭指標和隊尾指標,刪除一個結點的操作是( )。
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
答案:(1)Push(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);
}
}
答案:(1)6,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