先進後出的存儲模型,能夠理解爲一個開口的盒子,分爲靜態棧與動態棧(分別是以數組與鏈表爲基本組成部分)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;//把它本身幹掉 } }