重要的資料結構 堆疊

2021-07-24 23:01:44 字數 2090 閱讀 4711

先declare下,此堆疊(stack)不是記憶體中的stack,而是一種十分重要的資料結構,後進先出(lifo)的資料結構。

堆疊區別於樹和圖,是一種順序結構,它只能在一端進行增加元素,或者刪除元素的操作。這個所謂的「端」 就是棧頂。乙個stack當且僅當乙個元素沒有時,是空棧。

1)create乙個堆疊,並初始化

2)判斷是不是空棧。空棧的意思剛說過了

3)判斷堆疊有沒有滿。實際中這個意義不大,因為從語言層面很多語言已經把棧的容量自動擴充套件了

4)插入元素

5)刪除元素

6)獲取棧頂元素

7)求堆疊的size,也就是元素個數

8)銷毀堆疊

堆疊的實現,根據儲存結構的不同,可以有兩種方式。順序儲存對應順序堆疊,鏈式儲存對應鏈結堆疊。根據不同的儲存結構,操作的實現也有所區別

一、順序堆疊

#define m 100

typedef struct

stack;

現在依次來看下順序堆疊的操作

1)create堆疊

void createstack(stack *&s) 

2)判斷棧是不是空

bool isempty(stack *&s)

3)判斷順序堆疊是不是滿了
bool isfull(stack *&s)

4)增加乙個元素
void push(stack *&s, int elem)

}

5)彈出乙個元素,也就刪除乙個元素

void pop(stack *&s)

}

6)獲取棧頂元素

int top(stack *&s)

}

7)獲取堆疊的size

int size(stack *&s)

}

8)銷毀堆疊

void destroystack(stack *&s)

}

2、鏈式堆疊

先看下鏈式堆疊的結構定義

typedef struct node

stack;

現在依次來看下順序堆疊的操作

1)create堆疊。這裡只是建立了乙個堆疊結點,並且作為頭結點,本身的數字域是不存的。

void createstack(stack *&s) 

2)判斷棧是不是空。因為鏈式堆疊中的第乙個node不進行實際的內容儲存,所以當且僅當next指向空的時候,鏈式堆疊是空。

bool isempty(stack *&s)

3)判斷順序堆疊是不是滿了。由於使用鍊錶結構實現堆疊的時候,只要進行鏈結新node的操作,堆疊的長度就可以一直增加,不存在上溢位的問題。所以當使用鏈式堆疊的時候,不需要判斷堆疊是否已滿。

4)增加乙個元素

void push(stack *&s, int elem)

node *node = (stack*)malloc(sizeof(stack));

node.data = elem;

node->next = null;

tail->next = node;

free(tail);

}}

5)彈出乙個元素,也就刪除乙個元素
void pop(stack *&s)

}

6)獲取棧頂元素

int top(stack *&s)

}

7)獲取堆疊的size

int size(stack *&s)

}

8)銷毀堆疊

void destroystack(stack *&s)

}

資料結構 堆疊

對於棧,想必大家都十分熟悉了,也能很快的答出棧是乙個先進後出的佇列。但是在平常程式設計的生活中應用的十分少。在acm中,棧是一種十分重要的資料結構 其他領域也一樣 我們可以用這種資料結構解決一些十分棘手的問題,大大提高了程式的效率。有這樣一道名為software bugs 的題。題目的意思簡要來說就...

資料結構 堆疊

引入 多項式計算問題 例如 62 3 42 62 6 2 3 33 3 3 0 042 4 2 8 僅計算最近的兩個數 08 0 8 8 結束 需要某種方式 順序儲存,倒序輸出 堆疊 堆疊 具有操作約束性的線性表 入棧void push stack s,elementtype x else 出棧 e...

資料結構 堆疊

可以認為具有一定約束的線性表,其插入和刪除都作用於棧頂 top 的端點位置。且最 棧的資料最先彈出。壓入棧 push 插入資料 彈出棧 pop 取出 刪除 資料 型別名稱 堆疊 stack 資料物件集 乙個有0個或多個元素的有窮線性表 操作集 對於乙個具體的長度為正整數的maxsize的堆疊s st...