基本資料結構之-順序棧
棧是一種先進後出的資料結構,我們可以使用乙個陣列來模擬棧的這種結構,將陣列的尾部當做棧的棧頂似乎是乙個不錯的選擇(插入和移除元素是不涉及到資料的移動),也可以很好的控制陣列的長度,和資料的進棧和出棧!
首先先解析一下順序棧的資料結構
1 需要乙個資料域來儲存資料 考慮到可能儲存自定義的資料型別,所以我們選擇儲存每個資料的開始的位址 (void **stack)
2 需要乙個值來記錄當前的資料域的長度 (size)
3 需要乙個值來記錄當前的容器的長度
typedef struct _queuestack
queuestack;
接下來是棧的初始化
需要傳入乙個容量的引數,主要是測試的時候,我可以把長度設定小一點,哈哈!
// 初始化棧
int init_queuestack(void **queuestack, int capacity)
// 定義乙個棧結構體的指標
queuestack *stack = (queuestack *)malloc(sizeof(queuestack));
// 判斷開闢記憶體是否成功
if (stack == null)
// 為stack 開闢一段堆記憶體
stack->stack = (void **)malloc(sizeof(void *)*capacity);
// 判斷開闢記憶體是否成功
if (stack->stack == null)
// 寫入相關的變化
stack->capacity = capacity;
stack->size = 0;
// 將開闢出來的空間置零
memset(stack->stack, 0, sizeof(void *)*stack->capacity);
*queuestack = stack;
return 0;
入棧,當資料的長度等於容量時需要動態的開闢新的空間
//入棧
int push_queuestack(void *queuestack, void *data)
if (data == null)
// 將指標轉化為我們可以操作的型別
queuestack *stack = (queuestack *)queuestack;
if (stack->size == stack->capacity)
// 將開闢的空間全部置零
memset(newstack, 0, sizeof(void *)* stack->capacity * 2);
// 將原來的資料拷貝到新的棧
memcpy(newstack, stack->stack, sizeof(void *)*stack->capacity);
// 釋放原來棧的空間
free(stack->stack);
// 將棧的資料域指向新的位置
stack->stack = newstack;
stack->capacity *= 2;
}// 將資料加入到棧的資料域中
stack->stack[stack->size] = data;
++stack->size;
return 0;
//出棧 當資料域的長度為0 時,就不能正常的出棧了
int pop_queuestack(void *queuestack)
// 將指標轉化為我們可以操作的型別
queuestack *stack = (queuestack *)queuestack;
// 資料域沒資料沒法出棧
if (stack->size == 0)
else
return 0;
獲取棧頂的元素 當棧的資料域的長度為0 時 棧頂元素為空
void * top_queuestack(void *queuestack)
// 將指標轉化為我們可以操作的型別
queuestack *stack = (queuestack *)queuestack;
// 資料域沒資料沒法出棧
if (stack->size == 0)
else
銷毀棧,一定要記住不要釋放資料域,因為儲存的是位址,我們並不知道需要釋放的是開闢的堆記憶體還是棧記憶體,也不知道每個位址下的資料域的長度,所以還是交給使用者去釋放吧
int destory_queuestack(void *queuestack)
// 將指標轉化為我們可以操作的型別
queuestack *stack = (queuestack *)queuestack;
if (stack->stack != null)
free(stack);
return 0;
// 棧的長度
int size__queuestack(void *queuestack)
// 將指標轉化為我們可以操作的型別
queuestack *stack = (queuestack *)queuestack;
return stack->size;
如果想把開闢的陣列的其實位置看做棧頂的話,在每次入隊的時候記得把所有已經存在的資料向後移動乙個位置,同時出棧的時候,需要向前移動乙個位置。
棧的簡單總結(順序棧)
棧結構的特點 棧是線性表結構的一種,但是棧結構的插入與刪除操作都只能從同一端進行,所以棧結構是一種受限制的線性表結構,資料的插入與刪除符合lifo的原則 也就是後進先出,先進後出 棧的結構 對棧進行插入與刪除操作的一端稱為棧頂 top 另一端則稱為棧底 base 棧的進本操作 棧的基本操作有向棧中壓...
順序棧 棧的順序表示和實現
用順序表表示的棧的基本操作 include include define selemtype int define status int define stack init size 100 初始空間分配量 define stackincrement 10 儲存空間分配增量 using namesp...
棧的定義,順序棧,鏈式棧
棧又名堆疊,是資料暫時儲存的地方。它一種只能在頂端進行插入和刪除操作的特殊線性表,它按照先進後出的原則儲存資料,先進的資料被壓入棧底,最後的資料在棧頂,需要讀取資料的時候從棧頂開始彈出資料。棧具有記憶作用,對棧的插入和刪除操作中,不需要改變棧底指標。棧中允許進行插入和刪除操作的一端稱為棧頂 top ...