1. 程式人生 > >第三章-棧、佇列、陣列

第三章-棧、佇列、陣列

1.假設棧初始為空,將中綴表示式  轉換為等價字尾表示式的過程中,當掃描到f時,棧中的元素依次是 (B)

  • +(*-
  • +(-*
  • /+(*-*
  • /+-*
  • 解:

    基本概念:

    在中綴變字尾時,運算元的順序不會發生變化,只有運算子的順序可能發生變化。同時又沒有括號。所以在轉換的過程中,只要碰到運算元,可以直接輸出,而遇到運算子和括號進行相應的處理即可。

    轉換原則如下:

    1.從左到右讀取一箇中序表示式。

    2.若讀取的是運算元,則直接輸出。

    3.若讀取的是運算子,分三種情況。

    A.該運算子為左括號( ,則直接存入堆疊。

    B.該運算子為右括號),則輸出堆疊中的運算子,直到取出左括號為止。

    C.該運算子為非括號運算子,則與堆疊頂端的運算子做優先權比較,若較堆疊頂端運算子高或者相等,則直接存入堆疊;若較堆疊頂端運算子低,則輸出堆疊中的運算子。

    4.當表示式已經讀取完成,而堆疊中尚有運算子時,則依次序取出運算子,直到堆疊為空,由此得到的結果就是中綴表示式轉換成的字尾表示式。


  • 2.迴圈佇列放在一維陣列A[0…M-1]中,end1指向隊頭元素,end2指向隊尾元素的後一個位置。假設佇列兩端均可進行入隊和出隊操作,佇列中最多能容納M-1個元素。初始時為空。下列判斷隊空和隊滿的條件中,正確的是 A  

  • 隊空:end1 == end2;                                  隊滿:end1 == (end2+1)mod M
  • 隊空:end1 == end2;                                  隊滿:end2 == (end1+1)mod (M-1)
  • 隊空:end2 == (end1+1)mod M;     隊滿:end1 == (end2+1)mod M
  • 隊空:end1 == (end2+1)mod M;    隊滿:end2 == (end1+1)mod (M-1)
  •  

    解析:

    end1指向隊頭元素,那麼可知出隊的操作是先從A[end1]讀數,然後end1再加1。end2指向隊尾元素的後一個位置,那麼可知入隊操作是先存數到A[end2],然後end2再加1。若把A[0]儲存第一個元素,當佇列初始時,入隊操作是先把資料放到A[0],然後end2自增,即可知end2初值為0;而end1指向的是隊頭元素,隊頭元素的在陣列A中的下標為0,所以得知end1初值也為0,可知隊空條件為end1==end2;然後考慮佇列滿時,因為佇列最多能容納M-1個元素,假設佇列儲存在下標為0到下標為M-2的M-1個區域,隊頭為A[0],隊尾為A[M-2],此時佇列滿,考慮在這種情況下end1和end2的狀態,end1指向隊頭元素,可知end1=0,end2指向隊尾元素的後一個位置,可知end2=M-2+1=M-1,所以可知隊滿的條件為end1==(end2+1)mod M,選A。

    注意:考慮這類具體問題時,用一些特殊情況判斷往往比直接思考問題能更快地得到答案,並可以畫出簡單的草圖以方便解題。

  • 3.已知迴圈佇列儲存在一維陣列A[0...n-1]中,且佇列非空時front和rear分別指向隊頭元素和隊尾元素。若初始時佇列為空,且要求第1個進入佇列的元素儲存在A[0]處,則初始時front和rear的值分別是(B)。

  • 0,0
  • 0,n-1
  • n-1,0
  • n-1,n-1

這題和上題區別就是rear指向隊尾元素,而不是隊尾元素的下一個元素

4.設有下圖所示的火車車軌,入口到出口之間有n條軌道,列車的行進方向均為從左至右,列車可駛入任意一條軌道。現有編號為1~9的9列列車,駛入的次序依次是8,4,2,5,3,9,1,6,7。若期望駛出的次序依次為1~9,則n至少是 C 

  • 2
  • 3
  • 4
  • 解析:1最先出,所有1在一個軌道的開始

5.

解析:

三對角矩陣如下圖所示:

採用壓縮儲存,將3條對角線上的元素按行優先方式存放在一維陣列B中,且a1,1存放於B[0]中,其儲存形式如下所示:

可以計算矩陣A中3條對角線上的元素ai,j(1≤i,j≤n,|i-j|≤1)在一維陣列B中存放的下標為k=2i+j-3。

解法一:針對該題,僅需將數字逐一帶到公式裡面即可:k=2*30+30-3=87,結果為87。

解法二:觀察上圖的三對角矩陣不難發現,第一行有兩個元素,剩下的在元素m30,30所在行之前的28行(注意下標1≤i≤100、1≤j≤100)中每行都有3個元素,而m30,30之前僅有一個元素m30,29,那麼不難發現元素m30,30在陣列N中的下標是:2+28*3+2-1=87。

【注意】矩陣和陣列的下標是從0或1開始的(如矩陣可能從a0,0或a1,1開始,陣列可能從B[0]或B[1]開始),這時就需要適時調整計算方法(這個方法無非是針對上面提到的公式k=2*i+j-3多計算1或少計算1的問題)。