3-棧-順序儲存
阿新 • • 發佈:2022-01-25
筆記
棧是一種先進後出的儲存結構
結構示意圖
使用順序儲存-陣列形式
利用陣列來儲存棧,陣列尾部做棧頂,棧的size記錄當前棧內元素個數,也指示當前棧頂在陣列的哪個位置。
利用一個結構體來管理棧,成員為size和一個元素為void指標的陣列。棧只儲存指向資料的指標,所以也要注意資料的作用域。
要實現的介面
初始化、入棧(push)、出棧(pop)、獲取棧頂元素、獲取棧的大小、銷燬棧
程式碼
myStack.c
#include"myStack.h" #include<stdlib.h> #include<string.h> //建立一個元素為指標的陣列,陣列尾部做棧頂,減少資料操作 //初始化棧 myStackType* init_stack(){ myStackType* stack = malloc(sizeof(myStackType)); if(NULL == stack){ return NULL; } //清零 memset(stack->stack, 0, sizeof(void*)*MAX_LEN); stack->m_size = 0; return stack; } //入棧 void push_stack(myStackType* st, void* data){ if(NULL == st){ return; } if(st->m_size >= MAX_LEN){ return; } st->stack[st->m_size] = data; st->m_size++; } //出棧 void pop_stack(myStackType* st){ if(NULL == st){ return; } if(st->m_size <= 0){ return; } st->stack[st->m_size-1] = NULL; st->m_size--; } //獲取棧頂的資料 void* top_stack(myStackType* st){ if(NULL == st){ return NULL; } if(st->m_size <= 0){ return NULL; } return st->stack[st->m_size - 1]; } //棧資料大小 int size_stack(myStackType* st){ if(NULL == st){ return 0; } return st->m_size; } //銷燬棧 void destroy_stack(myStackType** st){ free(*st); *st = NULL; }
myStack.h
#ifndef __MYSTACK_H #define __MYSTACK_H #define MAX_LEN 1024 //這裡是固定容量 typedef struct { void* stack[MAX_LEN]; int m_size; }myStackType; myStackType* init_stack(); void push_stack(myStackType* st, void* data); void pop_stack(myStackType* st); void* top_stack(myStackType* st); int size_stack(myStackType* st); void destroy_stack(myStackType** st); #endif
start0.c
#include"myStack.h" #include<stdio.h> struct Persion{ char m_name[64]; int m_age; }; int main(){ myStackType* st = init_stack(); struct Persion p1 = {"aaa",10}; struct Persion p2 = {"bbb",20}; struct Persion p3 = {"ccc",30}; push_stack(st,&p1); push_stack(st,&p2); push_stack(st,&p3); printf("size=%d\n",size_stack(st)); while(size_stack(st) > 0){ struct Persion *p0 = top_stack(st); pop_stack(st); printf("name=%s\tname=%d\n",p0->m_name, p0->m_age); } printf("size=%d\n",size_stack(st)); destroy_stack(&st); return 0; }