1. 程式人生 > 其它 >4-棧-鏈式儲存

4-棧-鏈式儲存

筆記

棧-鏈式儲存

使用連結串列的方式儲存棧的指標資料,將棧頂設定在連結串列頭部

入棧就相當於頭插、出棧相當於頭刪

size記錄棧的大小,資料預留出4位元組用來儲存指標

程式碼

myStack.c

#include"myStack.h"
#include<stdlib.h>

//使用連結串列的方式儲存棧的指標資料,將棧頂設定在連結串列頭部
//入棧就相當於頭插、出棧相當於頭刪

//初始化管理棧的結構體
myStackType* init_stack(){
    myStackType* st = malloc(sizeof(myStackType));
    if(NULL == st){
        return NULL;
    }

    st->head.next = NULL;  //清零
    st->m_size = 0;

    return st;
}

//入棧
void push_stack(myStackType* st, void* data){
    if(NULL == st || NULL == data){
        return;
    }

    struct linkNode* myNode = data;  //將資料指標轉換成節點型別,使用data預留的4位元組

    myNode->next = st->head.next;  //頭插
    st->head.next = myNode;

    st->m_size++;
}

//出棧
void pop_stack(myStackType* st){
    if(NULL == st){
        return;
    }
    if(st->m_size == 0){
        return;
    }

    struct linkNode* delNode = st->head.next;  //頭刪

    st->head.next = delNode->next;

    st->m_size--;
}

//獲取棧頂資料
void* top_stack(myStackType* st){
    if(NULL==st || st->m_size==0){
        return NULL;
    }

    return st->head.next;  //即連結串列的第一個元素
}

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

struct linkNode{
    void* next;
};

typedef struct {
    struct linkNode head;
    int m_size;
}myStackType;

myStackType* init_stack(void);
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{
    void* next;
    char m_name[64];
    int m_age;
};

int main(){
    myStackType* st = init_stack();

    struct Persion p1 = {NULL,"aaa",10};
    struct Persion p2 = {NULL,"bbb",20};
    struct Persion p3 = {NULL,"ccc",30};
    struct Persion p4 = {NULL,"ddd",40};

    push_stack(st,&p1);
    push_stack(st,&p2);
    push_stack(st,&p3);
    push_stack(st,&p4);

    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;
}