C語言--棧的實現
阿新 • • 發佈:2018-11-11
#include <stdio.h> #include <malloc.h> #include <stdlib.h> typedef struct Node // 定義一個結構體,包含資料和指向下一個節點的指標 { int data; struct Node * p_next; //指向下一個節點的指標 型別也是struct Node * } NODE, *PNODE; /* 定義一個棧,包含棧頂和棧底節點 */ typedef struct Stack { PNODE p_top; PNODE p_bottom; } STACK, *PSTACK; voidinit_stack(PSTACK); void push_stack(PSTACK p_stack, int value); void traverse_stack(PSTACK p_stack); bool is_empty(PSTACK p_stack); bool pop_stack(PSTACK p_stack, int *value); void clear_stack(PSTACK p_stack); int main() { STACK S; //定義一個棧 此時 p_top 和 p_bottom 是無效資料,必須初始化 int value; init_stack(&S); push_stack(&S, 1); push_stack(&S, 2); push_stack(&S, 3); traverse_stack(&S); clear_stack(&S); if(pop_stack(&S, &value)) { printf("pop successfully, the element is %d\n", value); } else { printf("pop failed\n"); } traverse_stack(&S); } /* 初始化一個stack */ void init_stack(PSTACK p_stack) { p_stack->p_top = (PNODE)malloc(sizeof(NODE)); //為棧頂分配記憶體 if (p_stack->p_top == NULL) /* 如果為空返回失敗 */{ printf("dynamic memory malloc failed\n"); exit(-1); } else { /* 棧頂節點等於棧底節點 棧頂節點的下一個節點指向為空,需要指向新新增的節點的地址 */ p_stack->p_bottom = p_stack->p_top; p_stack->p_top->p_next = NULL; } } /* 壓棧 */ void push_stack(PSTACK p_stack, int value) { PNODE p_new = (PNODE)malloc(sizeof(NODE)); //新申請一塊空間給新的節點 p_new->data = value; //新節點的值為value p_new->p_next = p_stack->p_top; //新節點的指標域指向棧頂節點 p_stack->p_top = p_new; //棧頂節點指向新節點 把新節點的地址傳送給p_top return; } /* 遍歷棧中元素 */ void traverse_stack(PSTACK p_stack) { PNODE p = p_stack->p_top; while (p!= p_stack->p_bottom) { printf("%d ", p->data); p = p->p_next; } printf("\n"); } /* 出棧 */ bool pop_stack(PSTACK p_stack, int *value) { if (is_empty(p_stack)) //判斷棧是否為空 { return false; } else { /* 思路: 1.先將棧頂節點的值儲存起來 2.棧頂節點的指向下一個節點 3.釋放上一個地址的記憶體 */ PNODE r = p_stack->p_top; //定義一個節點r,指向p_top *value = r->data; //r的值存入value p_stack->p_top = r->p_next; //棧頂指向r->p_next free(r); //刪除元素 r = NULL; return true; } } /* 判斷棧是否為空 */ bool is_empty(PSTACK p_stack) { if (p_stack->p_top == p_stack->p_bottom) //如果二者相等,則棧為空 { return true; } else { return false; } } /* 清空棧 */ void clear_stack(PSTACK p_stack) { if (is_empty(p_stack)) { return; } else { PNODE p = p_stack->p_top; //定義指標p指向棧頂節點 PNODE q = NULL; //定義指標q /* 當指標p不等於棧底節點時,釋放記憶體 只要p指向的還有下一個元素,q就指向下一個元素,刪除p,p指向下一個元素 */ while (p != p_stack->p_bottom) { q = p->p_next; free(p); p = q; } p_stack->p_top = p_stack->p_bottom; } }
以上。