棧和佇列是兩種重要的線性結構。從資料結構的角度看,棧和佇列也是線性表,其特殊性在於棧和佇列的操作位置都在特定的位置。
引用自嚴蔚敏的資料結構與演算法教材
棧的結構體定義:
typedef struct stack
sqstack;
和鍊錶類似 我們首先要初始化順序棧:
sqstack initsqstack(int n)
s.top = s.base; //此時棧底指標base 和 棧頂指標top指向記憶體中的用一塊記憶體空間
s.stack_size = max_init_size;
for (int i = 0; i < 5; i++)
return s;
}
但是 與鍊錶相同 在初始化的同時為棧的元素賦值(應該這麼說吧 emmmm^ _ ^)
下面畫**釋一下為什麼在最開始棧底指標base 和 棧頂指標top處在同一位置
在最開始的時候即棧為空棧時 top 和 base指向同乙個地方 當順序棧中讀入了乙個資料之後 top指標後移並且順序棧大小減少1即size-1 即如圖所示
接下來介紹幾個基本的操作函式:
//驗證是否為空棧
void isempty(sqstack s)
else printf("棧非空!\n");
}
這裡稍微重點介紹一下插入元素這個操作:
//向棧中插入元素
sqstack pushelemtostack(sqstack s, int e)
s.base = temp;
s.top = s.base + s.stack_size;
s.stack_size += max_create_size;
} *s.top = e;
s.top++; //以上兩句可以合併為:*s.top++ = e;
return s;
}
我們將**拆分 具體介紹:
int *temp = s.base;
temp = (int *)realloc(s.base, sizeof(int) * (s.stack_size + max_create_size));
這兩句** 都來自於插入操作 之所以要將s.base重新儲存 是因為 在下面的申請記憶體空間的**中 會改變base的值 但是申請記憶體空間不一定會成功 所以要將base的值儲存到temp中 這樣即使申請記憶體空間失敗 原來的棧依然不會受到任何影響
其中realloc()函式和malloc函式的功能類似 但是realloc()函式是重新分配空間 函式的第乙個引數就是要改變大小的原記憶體位址
如果申請記憶體空間成功的話返回位址 失敗則返回null 這也是為什麼上面要將s.base儲存起來的原因
在這裡給出realloc函式的函式原型:extern void *realloc(void mem_address, unsigned int newsize);
realloc()函式在中(部分編譯器還需要),
用法:指標名=(資料型別)realloc(要改變記憶體大小的指標名,新的大小)
s.base = temp;
s.top = s.base + s.stack_size;
s.stack_size += max_create_size;
由於realloc函式改變了位址 即棧頂指標的指向也會隨之改變:s.top = s.base + s.stack_size;
改變之後的棧大小為原大小+新增大小即:s.stack_size += max_create_size;
有了push操作(插入) 也應該有與之對應的pop操作(讀取棧頂元素):
//讀取棧頂元素
int popelem(sqstack *s)
--(s->top);
return *s->top;
}
上最後兩句可以合併為一句return * -- s->top
畫圖描述最後兩句核心**:
C語言 實現 順序棧
seqstack.h 標頭檔案宣告如下 include typedef int datatype 自定義資料型別,假定為整型 typedef struct seqstack 順序棧定義 seqstack typedef struct seqstack pseqstack 順序棧的指標型別 建立乙個容...
C語言實現順序棧
順序棧,就是用一組位址連續的儲存單元來存放棧元素,然後用乙個棧結構去維護乙個棧。在c中,可用動態開闢的陣列去表示,維護的棧結構需要有乙個棧底和乙個棧頂指標。因為開闢乙個陣列需要事先知道它的大小,所以棧結構裡就必須還有乙個整型變數來表示當前棧的儲存容量,再可定義乙個變數用來擴充棧的最大容量。實現如下 ...
順序表棧C語言實現
seqstack.h created on 2019年8月1日 author administrator ifndef seqstack h define seqstack h 陣列去模擬棧的順序儲存,有陣列的後面模擬棧頂 避免資料頻繁移動 define max size 1024 define s...