1. 程式人生 > 其它 >3-棧-順序儲存

3-棧-順序儲存

筆記

棧是一種先進後出的儲存結構

結構示意圖

使用順序儲存-陣列形式

利用陣列來儲存棧,陣列尾部做棧頂,棧的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;
}