代碼部分數組
#include <stdio.h> #include <stdlib.h> #include <stdbool.h> #define INITSIZE 4 #define INCREMENT 2 typedef struct stack { int *base; int top; int size; }STACK, *PSTACK; void init(PSTACK); bool is_empty(PSTACK); bool is_full(PSTACK); bool push(PSTACK, int); void traverse(PSTACK); bool pop(PSTACK, int *); // 棧有效元素(節點)爲top + 1 void clear(PSTACK); void destroy(PSTACK); void destroy(PSTACK p) { if (is_empty(p)) return; free(p->base); p->top = -1; p->size = 0; } // 只是更新棧頂,棧所佔內存還在 void clear(PSTACK p) { printf("清空棧\n"); if (is_empty(p)) return; p->top = -1; } bool pop(PSTACK p, int *pVal) { printf("pop..."); if (is_empty(p)){ printf("棧空!\n"); return false; } *pVal = p->base[p->top--]; printf("成功 值爲%d\n", *pVal); return true; } void traverse(PSTACK p) { printf("遍歷(顯示順序棧頂=>棧底)\n"); if (is_empty(p)) { printf("棧空!\n"); return; } for (int i=p->top; i >=0; --i) { printf("%d\n", p->base[i]); } } bool push(PSTACK p, int val) { printf("push %d", val); if (is_full(p)) { p->base = (int *)realloc(p->base, sizeof(int) * (INCREMENT + p->size)); p->size += INCREMENT; if (! p->base) { printf(" 棧滿自動擴展空間失敗!\n"); return false; } else printf(" 棧滿自動擴展空間"); } p->base[++p->top] = val; printf(" 成功\n"); return true; } bool is_full(PSTACK p) { // 由於是數組下標從0開始 if (p->top == p->size - 1) return true; return false; } bool is_empty(PSTACK p) { if (p->top == -1) return true; return false; } void init(PSTACK p) { p->base = (int *)malloc(sizeof(int) * INITSIZE); p->top = -1; p->size = INITSIZE; } int main(void) { STACK S; int val; init(&S); push(&S, 1); push(&S, 2); push(&S, 3); push(&S, 4); push(&S, 5); push(&S, 6); traverse(&S); pop(&S, &val); pop(&S, &val); pop(&S, &val); traverse(&S); clear(&S); return 0; }