堆疊是一種後進先出(lifo)的資料結構。
基本的堆疊操作通常是進棧push和出棧pop。push是把乙個新值壓入到堆疊的頂部,pop就是把堆疊頂部的值移出堆疊並返回這個值。另外一種堆疊介面提供三個基本操作:push、pop和top。push操作和前面描述的一樣,pop只是把頂部元素從堆疊中移除,並不返回值,而top操作返回棧頂的元素,但不將其移除。第一種pop操作具有移除元素的***,而top操作沒有***,第二種堆疊介面的功能分得更細,每種功能都不帶***,所以第二種介面定義要更好一些。
堆疊的實現方式可以有三種:靜態陣列、動態陣列和鍊錶。如下的定義介面的標頭檔案可用於所有的三種實現方式。
堆疊介面標頭檔案stack.h:
/*
** 乙個堆疊模組的介面
*/#define stack_type int /*堆疊所儲存的值的型別*/
/*** push
** 壓入堆疊
*/void push(stack_type value);
/*** pop
** 彈出堆疊
*/void pop(void);
/*** top
** 返回堆疊頂部元素
*/stack_type top(void);
/*** is_empty
** 判斷堆疊是否為空
*/int is_empty(void);
/*** is_full
** 判斷堆疊是否已滿
*/int is_full(void);
/*** create_stack
** 建立堆疊,引數指定堆疊長度
** 這個函式不用於靜態陣列版本的堆疊
*/void create_stack(size_t size);
/*** destroy_stack
** 銷毀堆疊,釋放所使用的記憶體
** 這個函式不用於靜態陣列版本的堆疊
*/void destroy_stack(void);
在這個介面中,使用者可以根據自己的需要修改堆疊中值的型別stack_type的定義。
/*
** 用乙個靜態陣列實現堆疊
*/#include "stack.h"
#include
#define stack_size 100 /*堆疊長度*/
/*** 儲存堆疊中資料的陣列和指向棧頂的指標
*/static stack_type stack[stack_size];
static
int top_element = -1;
/*** push
*/void push(stack_type value)
/*** pop
*/void pop(void)
/*** top
*/stack_type top(void)
/*** is_empty
*/int is_empty(void)
/*** is_full
*/int is_full(void)
在這個實現中,所有不屬於外部介面的內容都被宣告為static,這是為了防止使用者使用介面之外的其他方式改變堆疊中的值。
靜態陣列實現方式中,堆疊的長度是在編譯之前就確定好的。
/*
** 動態陣列實現堆疊
** 堆疊的長度在建立堆疊的函式被呼叫時給出
*/#include "stack.h"
#include
#include
#include
#include
#include
/*** 用於儲存堆疊元素的陣列和棧頂指標
*/static stack_type *stack;
static size_t stack_size;
static
int top_element = -1;
/*** create_stack
*/void create_stack(size_t size)
/*** destroy_stack
*/void destroy_stack(void)
/*** push
*/void push(stack_type value)
/*** pop
*/void pop(void)
/*** top
*/stack_type top(void)
/*** is_empty
*/int is_empty(void)
/*** is_full
*/int is_full(void)
在進行堆疊操作之前必須先呼叫void create_stack(size_t size)函式建立堆疊,同時指明堆疊長度。堆疊操作結束後需要呼叫void destroy_stack(void)函式釋放記憶體。
/*
** 用單相鍊錶實現堆疊,這個堆疊沒有長度限制
*/#include "stack.h"
#include
#include
#include
#include
#define false 0
/*** 定義乙個結構儲存堆疊元素
*/typedef
struct stack_nodestacknode;
/*** 指向堆疊中第乙個節點的指標
*/static stacknode *stack;
/*** create_stack
*/void create_stack(size_t size)
/*** destroy_stack
*/void destroy_stack(void)
/*** push
*/void push(stack_type value)
/*** pop
*/void pop(void)
/*** top
*/stack_type top(void)
/*** is_empty
*/int is_empty(void)
/*** is_full
*/int is_full(void)
create_stack是個空函式,因為不需要事先申請一定的記憶體,記憶體是隨時要隨時生成。鍊錶實現的堆疊沒有長度限制,所以int is_full(void)函式永遠返回false。
destroy_stack函式連續從堆疊中彈出元素,直到堆疊為空。這裡的彈出元素與上面陣列方式不一樣,這裡是真正的刪除元素,連著該元素的記憶體一起釋放。
[1] kenneth a. reek. c和指標(第二版)[m]. 人民郵電出版社.
C 學習筆記之指標和const
首先,明白乙個概念 指向常量的指標。比如 const int pt 這說明 pt是指向int型常量的指標 pt只是個const int型指標!它的值 pt會改變,但是它指向的值不能變 從右向左看,p為常量,且乙個int 的指標。p的值無法改變,但是p指向的值可以改變。int a 10 int b 1...
C 學習筆記之 this指標
目錄this指標指向被呼叫的成員函式所屬的物件 include include using namespace std class person int main 0x61fe8c 1 0x61fe88 2 include include using namespace std class pers...
《C和指標》學習筆記
define name length 30 define addr length 100 define phone length 11 define max addresses 1000 char const lookup address char const name char const loo...