先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...