用連結串列建立棧 以及用陣列建立棧的區別
阿新 • • 發佈:2019-02-08
#include<stdio.h> #include<stdlib.h> typedef struct listnode { int data; struct listnode * next; }node,*Pnode; typedef struct stack { struct listnode *top; struct listnode *base; //建立連結串列的指標 }STACK,*pstack; void init(pstack s) //初始化 { s->top=(Pnode)malloc(sizeof(node)); //使頭指標指向動態分配的空間 if(NULL==s->top) { printf("動態記憶體分配失敗"); exit(-1); } else { s->base=s->top; s->top->next=NULL; //要把s->next=NULL 使其初始化 } } void push(pstack s,int num) //入棧 { Pnode pnew; pnew=(Pnode)malloc(sizeof(node)); //建立新的動態空間 pnew->data=num; pnew->next=s->top; //使新的指標指向頭指標 s->top=pnew; //頭指標指向新的空間 } bool empty(pstack s) { if(s->top==s->base) return true; else return false; } bool pop(pstack s,int *num) //出棧,num存出棧的值 { if(empty(s)) return false; else { Pnode pnew=s->top; *num=pnew->data; s->top=pnew->next; //建立新的指標,在釋放新指標所指向的空間 free(pnew); pnew=NULL; //新指標置為空 return true; } } void traverse(pstack s) //遍歷 { int num; Pnode p=s->top; while(p!=s->base) //建立新指標,不改變頭指標的位置 ,因為要遍歷而不是出棧 { num=p->data; printf("%d\t",num); p=p->next; } putchar('\n'); } void clear(pstack s) //清空棧 { if(empty(s)) return; else { Pnode p=s->top; Pnode q=NULL; //建立兩個新指標,這個地方重要 ,要想明白 while(p!=s->base) q=p->next; free(p); p=q; } s->top=s->base; //最後要保證s->top指向s->base } int main() { int n,val,num,i; STACK k; //定義棧的變數,因為是區域性變數,所以要傳地址 init(&k); scanf("%d",&n); for(i=1;i<=n;i++) { scanf("%d",&num); push(&k,num); } traverse(&k); if(pop(&k,&val)) printf("出棧成功,值為%d:\n",num); else printf("出棧失敗\n"); traverse(&k); clear(&k); return 0; }
1.注意棧的銷燬和棧的清空是不一樣的,棧的銷燬時把s->base free 掉,找不到整體,而棧的清空是還能在往上出棧入棧等各種操作;
2.陣列建立棧,是s.top指向沒有存值得空間,s.base指向存值的。而連結串列建立棧則相反 s->base指向沒有存值的,s->top指向存值的;
3.建立指標時,要注意把指標置為NULL,否則會成為野指標;
4.陣列建立的棧在另一個部落格中;