複習以前的內容c++
鏈表複習:算法
數據結構:數組
狹義:數據結構
數據結構是專門研究數據存儲的問題。函數
數據的存儲包含兩方面,個體的存儲,個體之間關係的存儲。學習
廣義:spa
數據結構既包含數據的存儲也包含數據的操做.net
對存儲數據的操做就是算法指針
算法:code
狹義的算法是與數據的存儲方式密切相關
廣義的算法是與數據的存儲方式無關
這就是泛型的思想
如何實現:1,經過模板;2,運算符的重載;3,經過指針 //這裏須要去學習c++,否則很難理解
泛型:
利用某種技術達到的效果就是:不一樣的存儲方式,執行的操做是同樣的
數據的存儲結構有幾種
1,線性
連續存儲(數組)
優勢:存取的速度很快
缺點:插入刪除元素就很慢了
實現必須知道數組的長度
插入刪除元素很慢
空間一般是有限制的
須要大塊連續的內存塊
離散存儲(鏈表)
優勢:空間沒有限制,只要內存夠用
插入刪除元素的速度很快,無需移動其餘元素
缺點:存取速度慢
線性結構的應用 1 棧 2,隊列
2,非線性
樹
圖
到了今天的主題,棧的操做,跟鏈表仍是很是類似的,只是棧將鏈表的有些功能給限制了。
/* 棧的操做 */ # include <stdio.h> # include <malloc.h> # include <stdlib.h> //節點結構體 typedef struct Node { int data; struct Node * pNext; }NODE,*PNODE; //棧結構體 typedef struct Stack { PNODE pTop; PNODE pBottom; }STACT,*PSTACT; //函數前置聲明 void init(PSTACT); //建立一個棧 void push(PSTACT, int); //向棧中壓入一個元素 void traverse(PSTACT); //遍歷這個棧 bool pop(PSTACT,int *); //從棧中彈出一個元素 bool clear(PSTACT); //清空這個棧 int main(void) { int val; //保存彈出的數據 //建立一個棧 STACT S; //初始化這個棧 init(&S); //推入一個元素 printf("壓入一個元素1\n"); push(&S,1); printf("壓入一個元素2\n"); push(&S,2); printf("壓入一個元素3\n"); push(&S,3); printf("壓入一個元素4\n"); push(&S,4); printf("遍歷這個棧:"); traverse(&S); printf("彈出一個元素:"); pop(&S, &val); traverse(&S); printf("再彈出一個元素:"); pop(&S, &val); traverse(&S); printf("將整個棧清空以後\n"); clear(&S); printf("遍歷這個棧:"); traverse(&S); return 0; } /* 初始化這個棧 @param PSTACT pst 棧的指針 return void */ void init(PSTACT pst) { PNODE p = (PNODE)malloc(sizeof(NODE)); if( NULL == p ) { printf("動態內存常見失敗\n"); exit(-1); } pst->pBottom = p; pst->pTop = pst->pBottom; p->pNext = NULL; return; } /* 往棧中推入一個元素 @param PSTACT pst 棧的指針 @param int val 要推入元素的值 return void */ void push(PSTACT pst,int val) { PNODE p = (PNODE)malloc(sizeof(NODE)); if( NULL == p ) { printf("動態內存常見失敗\n"); exit(-1); } p -> data = val; p -> pNext = pst -> pTop; pst -> pTop = p; return; } /* 判斷棧是否爲空 @param PSTACT pst 棧的指針 return Boolean */ bool is_empty(PSTACT pst) { if( pst->pBottom == pst->pTop ) { return true; } else { return false; } } /* 遍歷這個棧 @param PSTACT pst 棧的指針 return void */ void traverse(PSTACT pst) { if( is_empty(pst) ) { printf("棧爲空!\n"); exit(-1); } PNODE p = pst -> pTop; while( p != pst -> pBottom ) { printf("%d ",p -> data); p = p -> pNext; } printf("\n"); return; } /* 從棧中彈出一個元素 @param PSTACT pst 棧的指針 @param int * val 彈出元素的值 return Boolean */ bool pop(PSTACT pst , int * val) { if( is_empty(pst) ) { printf("棧爲空!\n"); return false; } PNODE p = pst -> pTop; *val = p -> data; pst -> pTop = p -> pNext; free(p); p = NULL; return true; } /* 清空這個棧 @param PSTACT pst 棧的指針 return Boolean */ bool clear(PSTACT pst) { PNODE q; if( is_empty(pst) ) { printf("棧爲空\n"); return false; } while(pst -> pTop != pst -> pBottom) { q = pst -> pTop -> pNext; free(pst -> pTop); pst -> pTop = q; } return true; } /* VC++6.0 輸出的結果是: ====================================== 壓入一個元素1 壓入一個元素2 壓入一個元素3 壓入一個元素4 遍歷這個棧:4 3 2 1 彈出一個元素:3 2 1 再彈出一個元素:2 1 將整個棧清空以後 遍歷這個棧:棧爲空! ====================================== 總結: 棧也就是一個鏈表,「先進後出」不能從中間插入或刪除 鏈表能夠從頭指針找到鏈表的頭部 棧使用棧頂指針對鏈表進行操做 */
學PHP的小螞蟻 博客 http://my.oschina.net/woshixiaomayi/blog