演算法與資料結構 三 棧

2022-06-24 19:03:10 字數 1439 閱讀 1885

棧與佇列一樣也是一種線性的資料結構,與佇列不同的是棧是一種先進後出的結構,有點類似於現實中的彈夾,最後壓進去的子彈總是最先被打出來,在計算機中棧用到的地方就是用作函式傳參與函式中區域性變數的儲存,也就是我們經常說的函式棧。棧同樣有基於陣列和基於鍊錶的實現

基於鍊錶實現的棧只需要乙個頭指標即可,插入刪除都在頭部進行。基於鍊錶的棧沒有棧滿這一說,棧空的條件是頭指標為null。

bool push(int nvalue)

memset(p, 0x00, sizeof(stack_node));

p->nval = nvalue;

p->pnext = g_top;

g_top = p;

return true;

}

引數入棧是不需要判斷棧是否為空的,不管是否為空,我們都採用同樣的演算法,即先使新節點的next指標域指向頭,然後再重新給頭指標賦值,由於不涉及到頭指標所指向位址的訪問,所以不需要額外判斷頭指標是否為空

元素出棧首先需要判斷棧是否為空,如果不為空,則需要乙個臨時指標儲存出棧元素,然後將頭指標進行偏移

bool pop(int* pvalue)

if (isstackempty())

*pvalue = g_top->nval;

lpstack_node p = g_top;

g_top = g_top->pnext;

free(p);

return true;

}

基於陣列實現的棧也需要乙個指標(或者在這裡稱之為下標),指向棧頂,在函式棧中這個充當棧頂指標的是乙個暫存器esp,而在函式棧中還有乙個棧的基位址是ebp,基於陣列的棧中,這個基位址就是陣列的首位址。

在基於陣列實現的棧中,根據棧頂指標是否為0來判斷。另外這種棧需要判斷棧是否已滿,一般採用的判斷方式是判斷棧頂指標是否為陣列的最大長度。

bool isstackempty()

bool isstackfull()

根據不同的實現方式會有不同的判斷方式,這裡是讓棧頂指標指向下乙個即將入棧的元素所在的位置,如果棧頂指標指向的是當前棧頂元素的位置,那麼這裡可能需要改為 等於 -1來判斷棧空,等於max_size - 1來判斷棧滿

bool push(int nvalue)

g_stack[g_top++] = nvalue;

return true;

}

bool pop(int* pvalue)

if (isstackempty())

*pvalue = g_stack[--g_top];

return true;

}

由於棧都是在一端進行操作,所以不存在向佇列那樣有空間浪費,也不需要實現什麼迴圈陣列。從實現上來看棧比佇列要簡單的多。

資料結構與演算法(三)棧

棧 stack 又名堆疊,它是一種運算受限的線性表。限定僅在表尾進行插入和刪除操作的線性表。這一端被稱為棧頂,相對地,把另一端稱為棧底。向乙個棧插入新元素又稱作進棧 入棧或壓棧,它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素 從乙個棧刪除元素又稱作出棧或退棧,它是把棧頂元素刪除掉,使其相鄰的元...

資料結構與演算法《棧》

概念 棧 stack 又名堆疊,它是一種運算受限的線性表。其限制是僅允許在表的一端進行插入和刪除運算。這一端被稱為棧頂,相對地,把另一端稱為棧底。向乙個棧插入新元素又稱作進棧 入棧或壓棧,它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素 從乙個棧刪除元素又稱作出棧或退棧,它是把棧頂元素刪除掉,使...

棧(資料結構與演算法)

給定乙個只包括 的字串,判斷字串是否有效。有效字串需滿足 左括號必須用相同型別的右括號閉合。左括號必須以正確的順序閉合。注意空字串可被認為是有效字串。示例 1 輸入 輸出 true示例 2 輸入 輸出 true示例 3 輸入 輸出 false示例 4 輸入 輸出 false示例 5 輸入 輸出 tr...