面試筆記 資料結構 佇列與棧

2021-09-27 08:47:17 字數 1880 閱讀 5642

1. 佇列:

佇列只允許從它的一端插入資料(隊尾),而從另一端取出資料(隊頭)。一般情況下,習慣使用鍊錶作為佇列的儲存結構:

typedef

struct qnodeqnode,

*queueptr;

typedef

struct

linkqueue;

上述**定義了乙個完整的佇列。qnode是佇列的結點型別,然後定義了乙個linkqueue型別,這時鏈佇列型別。它包含兩個域,front指向佇列的頭結點,用來存放隊頭元素的指標;rear指向佇列的尾結點,用來存放隊尾元素的指標。

2. 棧

typedef

struct

sqstack;

2.1 棧的初始化:
#define stack_init_size 10

intinitstack

(sqstack * s)

2.2 入棧操作:
#define stackincreament 10

intpush

(sqstack * s,

int e)

*(s->top)

= e;

//放入資料

s->top++

;return1;

}

2.3 出棧操作:
int

pop(sqstack * s,

int*e)

問題:

編寫乙個程式,使用棧結構實現乙個二/八進位制轉換器。

分析:進製轉換經常使用棧實現,這與資料流的輸入方式有關。輸入一串0/1字串,先輸入的字元處於二進位制數的高位,後輸入的字元處於二進位制數的低位。二進位制轉換為八進位制,必須從低位開始每三位0/1串轉換成乙個八進位制數,因此使用棧很方便。

c++實現:

void

bi2oct()

while

(s1.top != s1.base)

push

(&s2, sum +48)

;//將八進位制數以字元形式壓入棧中

sum =0;

}while

(s2.base != s2.top)

}

問題:

已知表示式中只允許兩種括號:圓括號和方括號,它們可以任意地巢狀使用,例如:[ ( ) ] 等都是合法的。但是要求括號必須成對出現,像 [ ( ] ) 或者 ( [ ) ] 的形式都是非法的。編寫乙個程式,從終端輸入一組括號,以字元『#』結束,判斷輸入的括號是否匹配合法。

分析:括號必須成對出現,可以利乙個棧來儲存輸入的括號,每輸入乙個括號都與棧頂的括號進行匹配。如果輸入的括號與棧頂中儲存的括號向匹配,則將棧頂的括號出棧,否則將輸入的括號入棧。按照這個規律進行下去,如果輸入的括號完全匹配,當輸入結束時,棧恰好為空,如果此時棧中仍有元素,則表明輸入的括號不匹配。

c++實現:

int

match

(char e,

char c)

;void

matchbracket()

else

}scanf

("%c"

,&c)

;//輸入下乙個字元}if

(s.top == s.base)

else

}int

match

(char e,

char c)

面試筆記 資料結構 單鏈表

可以通過下面的 定義乙個單鏈表 typedef struct node lnode,linklist 這裡使用typedef將結構體struct node定義為lnode型別,表示鍊錶中每個結點的型別為lnode,它等價於結構體型別struct node。另外,linklist是指向lnode型別的...

學習筆記 資料結構05 棧與佇列

棧是限定僅在表尾進行插入和刪除操作的線性表。佇列是只允許在一端進行插入操作 而在別一端進行刪除的操作的線性表。棧是限定僅在表尾進行插入和刪除操作的線性表。我們把允許插入和刪除的一端稱為棧頂。另一端稱為棧底,不含任何資料元素的棧稱為空棧。又稱後進先出線性表 lifo結構 理解 首先它是乙個線性表,也就...

面試筆記 資料結構 雙向鍊錶

雙向鍊錶是單鏈表的一種改進。單鏈表只能順著指標方向找到結點的後續結點,而無法找到其前驅結點。為此發明了迴圈鍊錶,只要通過迴圈的指標後移,一定可以找到前驅節點。但是迴圈鍊錶操作起來時間複雜度比較高,需要迴圈遍歷整個鍊錶。對於那些需要經常沿兩個方向移動指標的鍊錶來說,雙向鍊錶更合適。與單鏈表不同,雙向鍊...