【資料結構】C語言最基礎練習:棧的初始化,壓棧,出棧,遍歷,清空
阿新 • • 發佈:2018-12-17
隨手練習一下,詳細程式碼解釋都在程式碼片裡請仔細看看 如果有什麼不對的地方,請在下方留言 先建立標頭檔案:
#define _CRT_SECURE_NO_WARNINGS 1 #ifndef _TEST_H #define _TEST_H //棧的鏈式儲存結構; typedef struct Node //建立一種型別的節點; { int data; struct Node * pnext; }NODE, *PNODE; typedef struct Stack //建立一個棧型別,裡面含有兩個指標,一個指向棧頂,一個指向棧底 { PNODE ptop; PNODE pBottom; }STACK, *PSTACK; void init(PSTACK ps);//初始化棧 void push(PSTACK ps, int val);//壓棧 void traverse(PSTACK ps);//遍歷棧 bool empty(PSTACK ps);//判斷棧是否為空 bool pop(PSTACK ps, int * pval);//出棧 void clear(PSTACK ps);//清空棧 #endif //_TEST_H
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <malloc.h> #include <stdlib.h> #include <stdbool.h> #include "test.h" int main() { //int val;//儲存出棧的元素 STACK S;//定義一個棧變數 init(&S);//初始化這個棧 push(&S, 1);//壓棧 push(&S, 2); push(&S, 3); push(&S, 4); push(&S, 5); push(&S, 6); traverse(&S);//遍歷 /*if (pop(&S, &val))//出棧 { printf("出棧成功!出棧元素為%d \n", val); printf("-------------------------------------------------------\n"); } else { printf("出棧失敗!\n"); }*/ //traverse(&S); clear(&S);//清空 printf("-------------------------------------------------------\n"); printf("清空後棧中元素為:"); printf("棧中元素為:\n"); traverse(&S); //free(S);//銷燬棧 system("pause"); return 0; } void init(PSTACK ps) { ps->ptop = (PNODE)malloc(sizeof(NODE));//建立一個空棧 if (NULL == ps->ptop) { printf("success\n"); exit(-1); } else { ps->pBottom = ps->ptop;//棧底指標跟棧頂指標都指向這個新建的空節點 ps->ptop->pnext = NULL; } } void push(PSTACK ps, int val)//壓棧 { PNODE pNew = (PNODE)malloc(sizeof(NODE));//新建一個節點 pNew->data = val;//新節點資料域等於val pNew->pnext = ps->ptop;//新節點指標域指向棧頂指標所指向的節點,就是前面棧底跟棧頂同時指向的空節點,這樣就實現壓棧了 ps->ptop = pNew;//然後棧頂元素上移,始終指向就是最後入棧的節點 } void traverse(PSTACK ps)//遍歷 { PNODE p = ps->ptop;//遍歷是從棧頂依次輸出,所以建立一個指標,指向棧頂指標所指向的節點 while (p!=ps->pBottom)//當p所指向的節點不是棧底指標指向的節點時 { printf("%d\n", p->data);//輸出p所指向的節點的資料域的值 p = p->pnext;//然後指標p重新指向下一個節點 } } //bool pop(PSTACK ps, int * pval)//出棧一個元素 //{ // if (empty(ps))//先判斷棧是否為空 // { // return false; // } // else//不為空時 // { // PNODE r = ps->ptop;//建立一個新的指標r,指向棧頂指標所指向的節點 // *pval = r->data;//將該節點的資料域賦值給val // ps->ptop = r->pnext;//棧頂指標重新指向r所指向的下一個節點, // free(r);//釋放r所指向的節點,就是剛才的棧頂節點 // r = NULL;//清空 // return true; // } //} bool empty(PSTACK ps)//判斷棧是否為空 { if (ps->ptop == ps->pBottom) return true; else return false; } void clear(PSTACK ps)//清空棧內元素 { if (empty(ps)) { return ; } else { PNODE p = ps->ptop;//建立一個指標,指向當前棧頂指標指向的節點 PNODE q = NULL;//建立一箇中間指標 while (p!=ps->pBottom)//當p所指向的節點不是棧底指標所指向的節點時 { q = p->pnext;//先將p所指向的下一個節點賦給q free(p);//然後刪除該節點 p = q;//然後將q指向的節點賦給p,也就是p重新指向了p的下一個節點 } ps->ptop = ps->pBottom;//迴圈完了之後,棧底指標跟棧底指標指向同一個節點 } }