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結構 理解 首先它是乙個線性表,也就...
面試筆記 資料結構 雙向鍊錶
雙向鍊錶是單鏈表的一種改進。單鏈表只能順著指標方向找到結點的後續結點,而無法找到其前驅結點。為此發明了迴圈鍊錶,只要通過迴圈的指標後移,一定可以找到前驅節點。但是迴圈鍊錶操作起來時間複雜度比較高,需要迴圈遍歷整個鍊錶。對於那些需要經常沿兩個方向移動指標的鍊錶來說,雙向鍊錶更合適。與單鏈表不同,雙向鍊...