生活随笔
收集整理的這篇文章主要介紹了
Linux c 算法与数据结构--栈
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
前段時間寫了雙向鏈表,現在寫個棧,寫之前,先簡單介紹鏈表 隊列 棧的區別:
鏈表,隊列,堆棧的區別
1、棧是個有底的口袋,像襪子。
隊列是沒底的口袋,像通心粉。
所以:棧的特點是先進后出,隊列的特點是先進先出。
2、主要區別是適用的地方不一樣, ??
? 鏈表實際上可以認為是一種數據的物理組織形式,是用指針或對象的引用組織起的一種數據的存儲方式. ??
? 隊列和堆棧是一個更高層次的概念,其底層可以是用鏈表也可以是用數組來實現. ??
? 隊列和堆棧的主要區別是進出的順序不一樣, ??
? 隊列是先進先出,堆棧是后進先出. ??
3、cooled(經典中--經過非典中) ? 說的很詳細了,我補充一下 ??
? 隊列和堆棧是一種特殊的數據組織形式。 ??
? 可以把他們看成是一系列的集合。 ??
? 隊列可以看成是有2個口的集合一個口叫隊頭一個叫隊尾,只能在對頭進行刪除操作,在隊尾做插入。根據這樣的操作。隊列特點是先進先出 ??
? 堆棧可以看成是有1個口的集合,這個口叫棧頂。插入和刪除操作只能在棧頂操作。根據這樣的操作。堆棧的特點是是后進先出. ??
? 鏈表是一種存儲方式,它可以在非連續的內存空間里面存儲一個集合的元素。和它對應的是數組,數組要在連續的空間里存儲集合的元素
下面是棧的實驗代碼:
Stack.h
[cpp]?view plaincopy
#ifndef?_Stack_H?? #define?_Stack_H?? ?? typedef?struct?node?? {?? ????int?data;?? ????struct?node?*down;?? }PNode;?? ?? typedef?struct?stack?? {?? ????PNode?*top;?? ????int?size;?? }Stack;?? ?? Stack?*InitStack();?? ?? void?DestroyStack(Stack?*ps);?? ?? void?ClearStack(Stack?*ps);?? ?? int?IsEmpty(Stack?*ps);?? ?? int?GetSize(Stack?*ps);?? ?? PNode?*GetTop(Stack?*ps,int?*pitem);?? ?? PNode?*Push(Stack?*ps,int?item);?? ?? PNode?*Pop(Stack?*ps,int?*pitem);?? ?? void?StackTraverse(Stack?*ps,void?(*visit)());?? ?? #endif??
Stack.c
[cpp]?view plaincopy
#include?<stdio.h>?? #include?"Stack.h"?? #include?<malloc.h>?? #include?<stdlib.h>?? ?? Stack?*InitStack()?? {?? ????Stack?*ps;?? ????ps=(Stack?*)malloc(sizeof(Stack));?? ????if(ps!=NULL)?? ????{?? ????????ps->top?=?NULL;?? ????????ps->size?=?0;?? ????}?? ????return?ps;?? }?? ?? void?DestroyStack(Stack?*ps)?? {?? ????if(IsEmpty(ps)!=1)?? ????????ClearStack(ps);?? ????free(ps);?? }?? ?? void?ClearStack(Stack?*ps)?? {?? ????while(IsEmpty(ps)!=1)?? ????{?? ????????Pop(ps,NULL);?? ????}????? }?? ?? int?IsEmpty(Stack?*ps)?? {?? ????if(ps->top?==?NULL&&ps->size?==?0)?? ????return?1;?? }?? ?? ?? int?GetSize(Stack?*ps)?? {?? ????return?ps->size;?? }?? ?? PNode?*GetTop(Stack?*ps,int?*pitem)?? {?? ????if(IsEmpty(ps)!=1&&pitem!=NULL)?? ????{?? ????????*pitem?=?ps->top->data;?? ????}?? ????return?ps->top;?? }?? ?? PNode?*Push(Stack?*ps,int?item)?? {?? ????PNode?*pnode?=?(PNode?*)malloc(sizeof(PNode));?? ????if(pnode!=NULL)?? ????{????? ????????pnode->data?=?item;?? ????????pnode->down?=?GetTop(ps,NULL);?? ????????ps->size++;?? ????????ps->top?=?pnode;?? ????}?? ????return?pnode;?? }?? ?? PNode?*Pop(Stack?*ps,int?*pitem)?? {?? ????PNode?*pnode?=?ps->top;?? ????if(IsEmpty(ps)!=1&&pnode!=NULL)?? ????{?? ????????if(pitem!=NULL)?? ????????????*pitem?=?pnode->data;?? ????????ps->size--;?? ????????ps->top?=?ps->top->down;?? ????????free(pnode);?? ????}?? ????return?ps->top;?? }?? ?? void?StackTraverse(Stack?*ps,void(*visit)())?? {?? ????PNode?*p?=?ps->top;?? ????int?i?=?ps->size;?? ????while(i--)?? ????{?? ????????visit(p->data);?? ????????p?=?p->down;?? ????}?? }??
Test.c
[cpp]?view plaincopy
#include?"Stack.h"?? #include?<stdio.h>?? ?? void?print(int?i)?? {?? ????printf("The?data?of?this?node?is:%d\n",i);?? }?? ?? int?main()?? {?? ????Stack?*ps?=?InitStack();?? ????int?i,item;?? ?????? ????printf("0-9?push?in?stack,and?print:\n");?? ????for(i=0;i<10;i++)?? ????{?? ????????Push(ps,i);?? ????????GetTop(ps,&item);?? ????????printf("%d",item);?? ????}?? ?? ????printf("\nTraverse?from?stacktop?to?stack?down?and?print\n");?? ????StackTraverse(ps,print);?? ?? ????printf("The?data?of?stack?pop?as?it's?turn?and?print:\n");?? ????for(i=0;i<10;i++)?? ????{?? ????????Pop(ps,&item);?? ????????printf("%d",item);?? ????}?? ?? ????ClearStack(ps);?? ????if(IsEmpty(ps))?? ????????printf("\nIt?is?a?success?to?clear?the?stack\n");?? ????DestroyStack(ps);?? ????printf("The?stack?is?destroyed!\n");?? }??
執行結果如下:
makefile:
總結
以上是生活随笔為你收集整理的Linux c 算法与数据结构--栈的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。