紙上談兵 棧 stack

2022-02-16 18:33:15 字數 2490 閱讀 4805

棧(stack)是簡單的資料結構,但在計算機中使用廣泛。它是有序的元素集合。棧最顯著的特徵是lifo (last in, first out, 後進先出)。當我們往箱子裡存放一疊書時,先存放的書在箱子下面,我們必須將後存放的書取出來,才能看到和拿出早先存放的書。

棧中的每個元素稱為乙個frame。而最上層元素稱為top frame。棧只支援三個操作, pop, top, push。

pop取出棧中最上層元素(8),棧的最上層元素變為早先進入的元素(9)。

top檢視棧的最上層元素(8)。

push將乙個新的元素(5)放在棧的最上層。

棧不支援其他操作。如果想取出元素12, 必須進行3次pop操作。

棧以及pop, push, top操作

棧最經典的計算機應用是函式呼叫。每個程序都會有乙個棧,每個frame中記錄了呼叫函式的引數,自動變數和返回位址。當該函式呼叫乙個新的函式時,棧中會 push乙個frame。當函式執行完畢返回時,該frame會pop,從而進入呼叫該函式的原函式,繼續執行。詳細請參閱linux從程式到程序

實際使用的棧並不一定符合資料結構的棧。比如說,有的語言允許被呼叫函式檢視非top frame的記錄。這樣的棧更類似於下面的經典遊戲

由於棧是限定了操作的有序的元素集合,所以我們既可以在陣列的基礎上來實現棧,也可以在表的基礎上來實現棧。如果使用陣列來實現棧,我們需要預留充足的空間供棧使用,並需要乙個下標來記錄最上層元素的位置。

我們這裡使用單向鍊錶來實現棧。我們可以利用介紹表(list)的文章中已經定義的操作來實現三個操作,但這裡相對獨立的重寫了**。

/*

by vamei

*//*

use single-linked list to implement stack

*/#include

#include

typedef

struct node *position;

typedef

intelementtp;

//point to the head node of the list

typedef struct node *stack;

struct

node ;

stack init_stack(

void

);void

delete_stack(stack);

elementtp top(stack);

void

push(stack, elementtp);

elementtp pop(stack);

intis_null(stack);

void main(void

) printf(

"stack is null? %d\n

", is_null(sk));

delete_stack(sk);}/*

* initiate the stack

* malloc the head node.

* head node doesn't store valid data

* head->next is the top node */

stack init_stack(

void)/*

pop out all elements

* and then delete head node */

void

delete_stack(stack sk)

free(sk);}/*

* view the top frame */

elementtp top(stack sk)

/** push a value into the stack */

void

push(stack sk, elementtp value)

/** pop out the top value */

elementtp pop(stack sk)

else }

/*check whether a stack is empty

*/int

is_null(stack sk)

輸出結果:

stack is null? 0

pop: 8

pop: 2

pop: 1

stack is null? 1

棧, lifo

pop, push, top

update:

我之前是用雙向迴圈鍊錶實現的棧,後來發現這樣沒有必要。它不能給棧帶來額外的好處,還會增加所需的記憶體空間。

紙上談兵 佇列 queue

佇列 queue 是乙個簡單而常見的資料結構。佇列也是有序的元素集合。佇列最大的特徵是first in,first out fifo,先進先出 即先進入佇列的元素,先被取出。這一點與棧 stack 形成有趣的對比。佇列在生活中很常見,排隊買票 排隊等車 先到的人先得到服務並離開佇列,後來的人加入到佇...

紙上談兵 佇列 queue

佇列 queue 是乙個簡單而常見的資料結構。佇列也是有序的元素集合。佇列最大的特徵是first in,first out fifo,先進先出 即先進入佇列的元素,先被取出。這一點與棧 stack 形成有趣的對比。佇列在生活中很常見,排隊買票 排隊等車 先到的人先得到服務並離開佇列,後來的人加入到佇...

紙上談兵 雜湊表 hash table

a b人 身份證號 日期 星座 上面兩個對映中,人 身份證號 是一一對映的關係。在雜湊表中,上述對應過程稱為hashing。a中元素a對應b中元素b,a被稱為鍵值 key b被稱為a的hash值 hash value 韋小寶的hash值 對映在數學上相當於乙個函式f x a b。比如 f x 3x ...