資料結構(c語言)——鏈棧儲存結構及實現
阿新 • • 發佈:2018-11-11
鏈棧:就是一種特殊的單鏈表,FILO(先進後出)
通常對於連結串列來說:
1.是不需要頭節點的。
2.基本不存在滿棧的情況,除非記憶體已沒有可用的空間。
不多bibi你們都懂哈,直接上程式碼:
鏈棧結構:
typedef struct StockNode{ // 資料域 Element data; // 下個節點的指標域 struct StockNode *next; }StockNode,*LinkStackPtr; typedef struct LinkStack{ // 棧的大小 int count; // 記錄棧頂元素 LinkStackPtr top; }LinkStack;
鏈棧的操作:
// 當前棧是否為空棧 bool StatckEmpty(LinkStack *ls){ if(ls->count > 0){ return false; } return true; } // 入棧操作 Status Push(LinkStack *ls,Element v){ LinkStackPtr e = (LinkStackPtr)malloc(sizeof(StockNode)); e->data = v; // 把當前的棧頂元素值賦值給新節點的直接後繼 e->next = ls->top; // 將新節點賦值給棧頂指標 ls->top = e; ls->count++; return OK; } // 彈棧 Status Pop(LinkStack *ls,Element *v){ if(StatckEmpty(ls)){ return ERROR; } *v = ls->top->data; // 用來記錄要出棧的元素節點 LinkStackPtr temp; temp = ls->top; // 使棧頂指標下移一位,指向後面的節點 ls->top = ls->top->next; // 釋放要出棧元素所在空間 free(temp); // 將棧的大小更新 ls->count--; return OK; } // 獲取棧頂元素 void GetTop(LinkStack *ls,Element *v){ if(!StatckEmpty(ls)){ *v = ls->top->data; } } // 獲取棧的元素個數 int StatckLength(LinkStack *ls){ if(!StatckEmpty(ls)){ return ls->count; } return -1; } // 初始化棧 LinkStack* InitStack(){ LinkStack *ls; ls = (LinkStack *)malloc(sizeof(LinkStack)); ls->top = NULL; ls->count = 0; } // 建立一個鏈棧 void CreateLinkStack(LinkStack *ls,int size){ LinkStackPtr e; for(int i=1;i < size;i++){ Push(ls,i); } } // 列印棧: void LinkStackPrint(LinkStack *ls){ LinkStackPtr p = ls->top; printf("["); while (p) { printf("%d", p->data); p = p->next; if(p){ printf(", "); } } printf("]\n"); } // 清空棧 Status ClearStack(LinkStack *ls){ // 用來記錄要出棧的元素節點 LinkStackPtr temp; while(!stackEmpty(ls)){ temp = ls->top; // 使棧頂指標下移一位,指向後面的節點 ls->top = ls->top->next; // 釋放要出棧元素所在空間 free(temp); // 將棧的大小更新 ls->count--; } return OK; } // 銷燬棧 Status DestoryStack(LinkStack *ls){ ClearStack(ls); free(ls); return OK; }
測試程式碼:
void LinkStackTest(){ LinkStack *ls = InitStack(); printf("棧被初始化了\n"); CreateLinkStack(ls,5); printf("%d個元素已入棧",5-1); LinkStackPrint(ls); printf("一個元素入棧:"); Push(ls,5); LinkStackPrint(ls); Element pv; Element *resP; resP = &pv; Pop(ls,resP); printf("當前出棧元素:%d\n",*resP); int length = StatckLength(ls); printf("當前鏈棧的長度:%d\n",length); GetTop(ls,resP); printf("當前棧頂元素:%d\n",*resP); ClearStack(ls); //DestoryStack(ls);銷燬後這個棧將不存在,而不是個空棧 printf("清空整個棧後:"); LinkStackPrint(ls); }
執行結果