棧和佇列 考研 408

2021-10-23 23:10:07 字數 4455 閱讀 3654

棧的基本操作

initstack(&s):初始化

stackempty(s):判空,空則true,非空則false

push(&s,x):入棧

pop(&s,&x):出棧,並用x返回元素內容

gettop(s,&x):讀棧頂元素

destroystack(&s):銷毀並釋放空間

棧是一種受限的線性表,只允許在一端操作

棧若只能在棧頂操作,則只可能上溢

採用非遞迴方式重寫遞迴時,不一定要用棧,比如菲波那切數列只要用迴圈即可

共享棧:

從兩頭往中間填充,有效的利用空間。

出棧序列的個數:1?+1?2??

佇列也是受限的線性表,只允許在一端插入,另一端刪除

常見操作:

initqueue(&q):初始化,構造乙個空佇列q

queueempty(q):判空

enqueue(&q,x):入隊

dequeue(&q,&x):出隊並返回出隊的元素至x

gethead(q,&x):獲取對頭元素

佇列的大題真題考的是,畫初始狀態,判空判滿的條件,入隊基本過程

so先看類似的概念,想法,思路,後期再看具體的**實現,畢竟沒考過具體**

順序儲存定義:

#define maxsize 50

typedef structsqqueue;

迴圈佇列:

初始化:q.front=q.rear=0

隊首指標+1\入隊:q.front=(q.front+1)%maxsize

隊尾指標+1\出隊:q.rear=(q.rear+1)%maxsize

佇列長度:(q.rear+maxsize-q.front)%maxsize

因為隊滿和隊空都是q.front=q.rear,所以無法判斷到底是隊空還是隊滿

有三個解決辦法

1)常用方法:犧牲乙個單元來區分隊空和隊滿,入隊是少用乙個單元

2)型別中增設乙個資料成員表示元素個數,這樣隊空:q.size==0,隊滿:q.size==maxsize

3)增設tag,入隊時令tag=1,出隊時令tag=0,這樣能表示當q.front==q.rear時,如果tag==1,則隊滿,tag==0則隊空

鏈式儲存:

typedef struct linknodelinknode;

typedef structlinkqueue;

括號匹配

表示式求值

字尾表示式:資料進棧,操作符則彈出2個資料進行操作再將結果進棧

同乙個問題,遞迴演算法和非遞迴演算法一般來說,非遞迴效率比較低,因為有很多重複計算

圖的廣度優先演算法要借助輔助佇列

將中綴表示式轉換為字首表示式

轉換步驟如下:

初始化兩個棧:運算子棧s1,儲存中間結果的棧s2

從右至左掃瞄中綴表示式

遇到運算元時,將其壓入s2

遇到運算子時,比較其與s1棧頂運算子的優先順序

如果s1為空,或棧頂運算子為右括號「)」,則直接將此運算子入棧

否則,若優先順序比棧頂運算子的較高或相等,也將運算子壓入s1

否則,將s1棧頂的運算子彈出並壓入到s2中,再次轉到(4-1)與s1中新的棧頂運算子相比較

遇到括號時

如果是右括號「)」,則直接壓入s1

如果是左括號「(」,則依次彈出s1棧頂的運算子,並壓入s2,直到遇到右括號為止,此時將這一對括號丟棄

重複步驟2至5,直到表示式的最左邊

將s1中剩餘的運算子依次彈出並壓入s2

依次彈出s2中的元素並輸出,結果即為中綴表示式對應的字首表示式

例如:1+((2+3)×4)-5具體過程,如下表

掃瞄到的元素

s2(棧底->棧頂)

s1 (棧底->棧頂)

說明5

5 空

數字,直接入棧 -

5 -s1為空,運算子直接入棧 )

5 -)

右括號直接入棧 4

5 4 -)

數字直接入棧 x

5 4-)x

s1棧頂是右括號,直接入棧 )

5 4-)x)

右括號直接入棧 3

5 4 3

-)x) 數字

+5 4 3

-)x)+

s1棧頂是右括號,直接入棧 2

5 4 3 2

-)x)+ 數字

(5 4 3 2 +

-)x左括號,彈出運算子直至遇到右括號 (

5 4 3 2 + x -

同上 +

5 4 3 2 + x -+

優先順序與-相同,入棧 1

5 4 3 2 + x 1 -+

數字到達最左端

5 4 3 2 + x 1 + - 空

s1剩餘運算子

結果是:- + 1 × + 2 3 4 5

將中綴表示式轉換為字尾表示式

與轉換為字首表示式相似,步驟如下:

初始化兩個棧:運算子棧s1和儲存中間結果的棧s2;

從左至右掃瞄中綴表示式;

遇到運算元時,將其壓s2;

遇到運算子時,比較其與s1棧頂運算子的優先順序:

如果s1為空,或棧頂運算子為左括號「(」,則直接將此運算子入棧;

否則,若優先順序比棧頂運算子的高,也將運算子壓入s1(注意轉換為字首表示式時是優先順序較高或相同,而這裡則不包括相同的情況);

否則,將s1棧頂的運算子彈出並壓入到s2中,再次轉到(4-1)與s1中新的棧頂運算子相比較;

遇到括號時:

如果是左括號「(」,則直接壓入s1;

如果是右括號「)」,則依次彈出s1棧頂的運算子,並壓入s2,直到遇到左括號為止,此時將這一對括號丟棄;

重複步驟2至5,直到表示式的最右邊;

將s1中剩餘的運算子依次彈出並壓入s2;

依次彈出s2中的元素並輸出,結果的逆序即為中綴表示式對應的字尾表示式**換為字首表示式時不用逆序)

例如,將中綴表示式「1+((2+3)×4)-5」轉換為字尾表示式的過程如下

掃瞄到的元素

s2(棧底->棧頂)

s1 (棧底->棧頂)

說明1

1 空

數字,直接入棧 +

1 +s1為空,運算子直接入棧 (

1+ (

左括號,直接入棧 (

1+ ( ( 同上

21 2

+ ( ( 數字

+1 2

+ ( ( +

s1棧頂為左括號,運算子直接入棧 3

1 2 3

+ ( ( + 數字

)1 2 3 +

+ (右括號,彈出運算子直至遇到左括號 ×

1 2 3 +

+ ( ×

s1棧頂為左括號,運算子直接入棧 4

1 2 3 + 4

+ ( × 數字

)1 2 3 + 4 × +

右括號,彈出運算子直至遇到左括號 -

1 2 3 + 4 × + -

-與+優先順序相同,因此彈出+,再壓入- 5

1 2 3 + 4 × + 5 -

數字到達最右端

1 2 3 + 4 × + 5 - 空

s1中剩餘的運算子

因此結果為「1 2 3 + 4 × + 5 -」

對稱矩陣

三角矩陣

三對角矩陣:又稱帶狀矩陣

稀疏矩陣:三元組既可以用陣列儲存,也可以用十字鍊錶法

匯流排 考研 408

片內容線 cpu晶元內部暫存器與暫存器之間 暫存器與alu之間的公共連線線 系統匯流排 計算機內部 cpu 主存 i o介面 之間相互連線 1 資料匯流排 雙向傳輸匯流排,傳輸資料資訊 3 控制匯流排 傳輸控制資訊 cpu送出的控制命令 和主存 外設返回cpu的反饋訊號 通訊匯流排 計算機系統之間或...

記憶體管理 考研 408

記憶體管理的功能 記憶體空間的分配和 位址轉換 記憶體空間的擴充 儲存保護 記憶體的裝入模組在裝入記憶體時,有以下三種方式 絕對裝入 位址就是絕對位址,要求連續 記憶體保護 要訪問位址時,判斷是否越界 重定位暫存器 基址暫存器 界位址暫存器 限長暫存器 覆蓋與交換技術 覆蓋 把使用者空間分為固定區和...

物理層 考研 408

碼元傳輸速率 碼元速率 波形速率 單位時間內傳輸的碼元個數 脈衝個數 訊號變化次數 單位波特 baud 但碼元速率與進製數無關 資訊傳輸率 資訊速率 位元率 單位時間內傳輸的二進位制碼元個數 位元數 單位位元 秒 b s 沒有雜訊,頻寬有限 w 理想低通訊道的頻寬,單位hz v 每個碼元可代表的個數...