數據結構之棧(第三天)

定義

先進後出的存儲模型,能夠理解爲一個開口的盒子,分爲靜態棧與動態棧(分別是以數組與鏈表爲基本組成部分)node

實例理解

​ 這是一個基礎的動態棧,其中難理解的部分我已經盡力標註了數組

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<stdbool.h>


//節點結構體,由於描述的是一個動態棧
typedef struct node{
    int date;
    struct node * pnext;
}node,*pnode;


typedef struct stack{
    pnode top;//指向棧的頂端的指針
    pnode bot;//指向棧的底端的指針
}stack,*pstack;

//聲明函數,能夠不須要形參,但必定要數據類型
void init(pstack s);
void push(pstack s, int val);
void bianli(pstack s);
bool pop(pstack,int*);//返回值用void仍是bool,主要是看該操做是否可能會失敗
bool is_empty(pstack s);

int main(void){
    //首先考慮的應該是數據,而不該該寫函數
    stack s;
    
    init(&s);
    push(&s,1);
    push(&s,2);
    bianli(&s);
    
    return 0; 
}


void init(pstack s){
    s->top = (pnode)malloc(sizeof(node));//至關於建了一個指針
    if(s->top == NULL){
        printf("動態分配失敗");
        exit(-1);
    }
    else
    {
        s->bot = s->top;//兩個指針是同樣的,指向同一個節點  
        s->top->pnext = NULL;//s->top->pnext 這東西指向的位置是一個很迷的位置,因此必須將其清空
    }
}



void push(pstack s,int val){
    pnode pnew = (pnode)malloc(sizeof(node));//創造了一個指針與它指向的位置
    pnew->date = val;
    pnew->pnext = s->top;//將這個新的指針指向棧底部的一個節點,而這個節點的地址就是指向它指針的值,也就是s->top
    s->top = pnew;//兩個指針賦值,和int*p = &a;沒有區別
        return;
}


void bianli(pstack s){
    pnode p = s->top;
    while(p !=s->bot){
        printf("%d ",p->date);
        p = p->pnext;
    }
    return;
}


bool is_empty(pstack s){
    if(s->top == s->bot)
        return true;
    else
        return false;
}

bool pop(pstack s, int* val){
    if(is_empty(s)){
        return false;
    }
    else
    {
        pnode r = s->top;//爲何要創造一個r,由於直接轉移頂指針會浪費最上面的一個節點
        s->top = r->pnext;
        free(r);//把它指向的位置清空
        r = NULL;//把它本身幹掉
    }
}
相關文章
相關標籤/搜索