int
、char
和 string
資料型別,但可以輕鬆擴展以支援其他資料型別,例如 float
、double
等。void (*init)(struct Stack *s)
: 初始化堆疊。void (*push)(struct Stack *s, void *element)
: 將元素壓入堆疊。void* (*pop)(struct Stack *s)
: 從堆疊中彈出元素。void* (*top)(struct Stack *s)
: 獲取堆疊頂部的元素。bool (*isFull)(struct Stack *s)
: 檢查堆疊是否已滿。bool (*isEmpty)(struct Stack *s)
: 檢查堆疊是否為空。int (*size)(struct Stack *s)
: 獲取堆疊當前的大小。void (*free)(struct Stack *s)
: 釋放堆疊佔用的記憶體。void (*print)(struct Stack *s)
: 列印堆疊的資訊。$ make test_stack
$ gcc -c -o <your_program>.o <your_program>.c
$ gcc -Wall -o <your_program> <your_program>.o stack/stack.o stack/stack_char.o stack/stack_string.o stack/stack_int.o
$ ./<your_program>
int
資料型別的堆疊範例。
#include "stack/stack.h"
int main() {
Stack *stack = createStack(INT);
if (!stack->top(stack)) {
printf("stack is empty\\n");
}
int i = 123;
stack->push(stack, &i);
int *poppedInt = (int *)stack->pop(stack);
printf("Popped from int stack: %d\\n\\n", *poppedInt);
return 0;
}
char
資料型別的堆疊範例。
#include "stack/stack.h"
int main() {
Stack *stack = createStack(CHAR);
if (*(char*)stack->top(stack) == '\0') {
printf("stack is empty\n");
}
char c = 'a';
stack->push(stack, &c); // passed by reference
char *poppedChar = (char *)stack->pop(stack);
printf("Popped from char stack: %c\n\n", *poppedChar);
stack->free(stack);
return 0;
}
createStack
的參數是堆疊的類型,該類型可以是 INT
、CHAR
或 STRING
。你可以在 stack_float.h
中的 struct StackType
中查看支援的資料型別。push
時,您需要傳遞要壓入堆疊資料的記憶體位置,因為 push
的函數指標定義為 void (*push)(struct Stack *s, void *element)
。pop
和 top
時,您需要將返回值轉型為正確的資料型別,這與 C 語言中使用 malloc()
類似,以避免 incompatible pointer type
的警告,因為返回值是一個 void *
指標。pop
和 top
操作中為空時:
INT
類型,pop
和 top
的返回值為 NULL
。CHAR
類型,pop
和 top
的返回值為 "\0"
。STRING
類型,pop
和 top
的返回值為 "\0"
。make test TARGET=test_stack
int
資料型別的堆疊
make test TARGET=test_stack_int
char
資料型別的堆疊
make test TARGET=test_stack_char
string
資料型別的堆疊
make test TARGET=test_stack_string
如果想擴展堆疊以支援其他資料型別,例如 float
、double
,可以按照以下步驟:
stack
目錄中新增 stack_float.c
和 stack_float.h
檔案。stack_float.c
中實現堆疊功能,並在 stack_float.h
中聲明函數。Makefile
中新增規則以編譯新的堆疊檔案。
OBJS_STACK = stack/stack.o stack/stack_char.o stack/stack_string.o stack/stack_int.o stack/stack_float.o
stack/stack.h
中更新 enum StackType
以支援新資料型別。stack/stack.c
中更新以支援新資料型別。
#include "stack_float.h"
createStack
函數中根據新資料型別新增 switch case
。$ make test_stack
$ gcc -c -o <your_program>.o <your_program>.c
$ gcc -Wall -o <your_program> <your_program>.o stack/stack.o stack/stack_char.o stack/stack_string.o stack/stack_int.o stack/stack_float.o
$ ./<your_program>