這次給大家介紹用單鏈表實現的棧。如圖
這裡介紹雙向鍊錶的常用操作:
l 建立棧l 銷毀棧
l 清空棧
l 壓棧
l 出棧
l 返回棧頂元素
l 返回棧的大小
**總分為三個檔案:linkstack.h : 放置功能函式的宣告,以及表的宣告
linkstack.c : 放置功能函式的定義
main.c : 主函式,使用功能函式完成各種需求,一般用作測試
整體結構圖為:
這裡詳細說下插入壓棧,出棧操作和返回棧頂元素操作:
壓棧操作:
如圖:
出棧操作:
返回棧頂元素:
如圖:
如果(表首用作棧頂,表尾用作棧底)時,每次壓棧和出棧操作時就不會遍歷表,因為兩個操作都是在棧頂(表首)進行。
如果(表首用作棧底,表尾用作棧頂)時,每次壓棧和出棧操作時都要遍歷表。
所以第一種方案較合適。
ok! 上**:
linkstack.h :[cpp]view plain
copy
#ifndef _linkstack_h_
#define _linkstack_h_
typedef
void
linkstack;
linkstack* linkstack_create();
void
linkstack_destroy(linkstack* stack);
void
linkstack_clear(linkstack* stack);
intlinkstack_push(linkstack* stack,
void
* item);
void
* linkstack_pop(linkstack* stack);
void
* linkstack_top(linkstack* stack);
intlinkstack_size(linkstack* stack);
#endif
linkstack.c :
[cpp]view plain
copy
#include
#include "linklist.h"
#include "linkstack.h"
typedef
struct
_tag_linkstacknode
tlinkstacknode;
linkstack* linkstack_create()
void
linkstack_destroy(linkstack* stack)
void
linkstack_clear(linkstack* stack)
} intlinkstack_push(linkstack* stack,
void
* item)
if(!ret)
return
ret;
} void
* linkstack_pop(linkstack* stack)
return
ret;
} void
* linkstack_top(linkstack* stack)
return
ret;
} int
linkstack_size(linkstack* stack)
main.c :
[cpp]view plain
copy
#include
#include "linkstack.h"
intmain(
void
)
printf("top: %d\n"
, *(
int*)linkstack_top(stack));
printf("length: %d\n"
, linkstack_size(stack));
while
(linkstack_size(stack) > 0)
linkstack_destroy(stack);
return
0;
}
Java棧 單鏈表實現
鍊錶結構,用乙個top指向鍊錶棧頂,不需要其它的指標,當top指向為空時,棧為空 這個圖我畫的有點醜,大家將就看下 棧為空時,出棧或者取棧頂元素異常 public class stackemptyexception extends runtimeexception public class stac...
資料結構 單調棧,單調佇列
乙個單調遞增棧的例子 進棧元素分別為3,4,2,6,4,5,2,3 第i步操作結果1 3進棧3 23出棧,4進棧43 2進棧4 2 42 4出棧,6進棧65 4進棧6 4 64出棧,5進棧 6 57 2進棧6 5 2 82出棧,3進棧 6 5 3 對於乙個元素i 在 尾部 新增元素 while r ...
資料結構 單鏈表實現
線性表的鏈式儲存結構的特點是用一組任意的儲存單元儲存線性表的資料元素 這組儲存單元可以是連續的,也可以是不連續的 因此,為了表示每個資料元素與其直接後繼資料元素之間的邏輯關係,對資料元素來說,除了儲存其本身的資訊之外,還需儲存乙個指示其直接後繼的資訊 即直接後繼的儲存位置 這兩部分資訊組成資料元素的...