堆疊的實現

2022-06-03 11:06:14 字數 2627 閱讀 7559

堆疊相對於我們程式語言的初學者而言是十分常見的,甚至在我們今後的學習中也是非常普遍的一種資料儲存方式,因為函式的引數(形參)就是儲存在堆疊中的,這麼看來,堆疊的知識非常重要,那麼,本人就在這篇博文中來為大家講解一下堆疊的知識

堆疊有一點對於初學者而言很容易出錯的知識點:

堆疊可以被稱之為「棧」,但是不能被稱作「堆」,堆疊和堆是有區別的,那麼,在這裡本人來講解一下堆和堆疊的區別:

堆疊

1.堆疊又名棧,它是一種運算受限的線性表。其限制是僅允許在表的一端進行插入和刪除運算。這一端被稱為棧頂,相對地,把另一端稱為棧底;

2.堆疊就是乙個桶,遵循先進後出的原則。

1.堆通常是乙個可以被看做一棵「樹」的陣列物件。堆總是滿足下列性質:

堆中某個節點的值總是不大於或不小於其父節點的值;

堆總是一棵完全二叉樹。

根節點最大的堆被稱為最大堆大根堆根節點最小的堆叫做最小堆小根堆

2.堆是在程式執行時,而不是在程式編譯時,申請某個大小的記憶體空間。即動態分配記憶體,對其訪問和對一般記憶體的訪問沒有區別(即malloc()函式和calloc()函式所運用的,就是堆空間)。

總而言之,像我們初學者,所運用最多的還是形參保存在堆疊(棧)中,並且資料都是先入後出的,而malloc()函式和calloc()函式,則是在堆中申請空間。

那麼,我們來用c語言方式實現堆疊的儲存方式:

首先則是標頭檔案"mec.h":

#ifndef _mec_h_

#define _mec_h_

typedef unsigned char boolean;

#define true 1

#define false 0

#endif

那麼,接下來是定義乙個儲存資料的結構體:

typedef struct mec_stack mec_stack;
結構體構建好了,接下來我們要做的是初始化堆疊

至於返回值,因為初始化可能會失敗,所一返回值是boolean型別,而引數就是堆疊(結構體陣列)的指標和容量

boolean initstack(mec_stack **stack, int capacity) 

res = (mec_stack *) calloc(sizeof(mec_stack), 1);

res->stack = (void **) calloc(sizeof(void *), capacity);

res->capacity = capacity;

res->top = 0;

*stack = res;

return true;

}

和以前一樣,初始化完成後一定要記得編寫銷毀函式

void destorystack(mec_stack **stack) 

free((*stack)->stack);

free(*stack);

*stack = null;

}

因為資料儲存主要是錄入和取出操作,所以,我們要先編寫判空判滿函式:

判空函式

boolean isstackempty(const mec_stack *stack)
判滿函式

boolean isstackfull(const mec_stack *stack)
那麼,接下來就是錄入函式

boolean push(mec_stack *stack, void *data) 

stack->stack[stack->top++] = data;

return true;

}

還有取出函式

void *pop(mec_stack *stack) 

return stack->stack[--stack->top];

}

我們如果想對於堆疊內的資料進行操作,和佇列不同的是棧頂指標會根據我們錄入資料和取出資料而移動,而我們的操作都要用到棧頂指標,所以,我們在來編寫乙個讀取棧頂指標的函式:

void *readtop(const mec_stack *stack) 

return stack->stack[stack->top - 1];

}

其他所有的操作都是在這幾個函式的基礎上構建的,所以我們要清楚地掌握以上的幾種函式。

關於和堆疊(先入後出)處理資料方式相反的佇列(先入先出)的異同點,將在本人的另一篇博文《佇列的實現》中進行詳解

堆疊的實現

堆疊 後進先出 基本的操作有 push 入堆 pop 彈出 入堆 將資料放入到堆疊的頂部 彈出 將頂端的資料輸 include include include typedef struct stk stack int stack empty stack stack1 else void push s...

堆疊的c 實現

最近開始學習資料結構,說是學習,以前在大學裡面沒有好好學習,純粹是為了考試而學的,現在自己寫了個stack的c 實現,貼出來 template class cstack cpp檔案 include stdafx.h include bindtest.h include using namespace...

鏈式堆疊的實現

include stdlib.h include stdio.h include string.h define true 1 define false 0 typedef structlelemtype typedef struct templstack lstack initstack void...