第三章-棧、佇列、陣列
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的問題)。