數據結構是什麼?要了解數據結構,咱們要先明白數據和結構,數據就是一些int char 這樣的變量,這些就是數據,若是你是一個籃球愛好者,那麼你的球鞋就是你的數據,結構就是怎麼把這些數據排列組合,怎麼把數據擺放好才能方便你找到這些數據,把數據和結構合在一塊兒理解就是所謂的數據結構,簡單點,就是處理數據的方式方法。面試
平時在家裏面,你有沒有隨便擺放本身的鞋子,而後要找鞋子的時候要花費很是可能是時間,可能你老婆也很生氣,天天都亂擺鞋子致使她打掃衛生很是麻煩,而後有一天,你買了一個很是酷的鞋架,有了這個鞋架以後,你的鞋子終於有家了,這個鞋架就是起處處理鞋子的做用了。編程
棧能夠理解爲數據結構中的一種,這種數據結構的特色是先進去的人「數據」後出來,就像下面的圖片同樣,若是棧是一個洞,人「數據」只能從洞的一個口進去,而後出來也只能從一個口出來,並且洞的寬度就只能容納一我的「數據」,好了,那先進去的那我的「數據」最傻逼了,必定要等後面進來的人「數據」都先出去了才能出去。windows
我寫代碼是很水的,以前有一個同窗寫了一個棧讓我檢查,我看了下,好像我寫代碼的能力比他厲害一些,代碼比較簡單,而後講一下幾個比較重要的函數,但願你們在面試的時候,隨手就甩出一個棧「砸死」面試官,哈哈。
#include "stdio.h" #include "stdlib.h" struct List{ int data; struct List * next; }; struct Stack{ struct List *head; int size; }; struct Stack * StackInit(void) { struct Stack *stack = NULL; stack = (struct Stack*)malloc(sizeof(struct Stack)); stack->head = (struct List *)malloc(sizeof(struct List)); stack->head->next = NULL; stack->size = 0; return stack; } int StackPush(struct Stack *stack,int data) { struct List *tmp = (struct List *)malloc(sizeof(struct List)); tmp->data = data; tmp->next = stack->head->next; stack->head->next = tmp; stack->size++; //printf("push:%d \n",data); return 0; } int IsStackEmpty(struct Stack *stack) { /*若是頭指針指向下一個爲空,說明棧爲空*/ if(stack->head->next == NULL) return 1; else return 0; } int StackPop(struct Stack *stack,int *data) { struct List *tmp = NULL; if(IsStackEmpty(stack)) return -1; tmp = stack->head->next; *data = tmp->data; stack->head->next = tmp->next; stack->size--; free(tmp); //printf("pop:%d \n",*data); return 0; } int main(void) { int i = 0; struct Stack *stack = NULL; stack = StackInit(); for(i = 0;i<5;i++) { StackPush(stack,i); } for(i = 0;i<5;i++) { int data = 0; StackPop(stack,&data); printf("%d ",data); } printf("\n"); return 0; }
棧頭部,也就是棧頂指針,咱們用指針單鏈表實現一個棧,必定要知道這個棧頂的指針,有頭就有棧,沒有頭,這個棧也就跨了。數組
struct Stack *stack = NULL; stack = StackInit();
這個就是定義一個棧,也就是malloc出來一個內存,專門存這個棧頂的。數據結構
出棧的方法跟我以前說的差很少,只不過出棧代碼上須要作判斷。函數
int StackPop(struct Stack *stack,int *data) { struct List *tmp = NULL; if(IsStackEmpty(stack)) return -1; tmp = stack->head->next; *data = tmp->data; stack->head->next = tmp->next; stack->size--; free(tmp); //printf("pop:%d \n",*data); return 0; }
先判斷這個棧是否是空的,是否是空的判斷方法就是經過判斷head->next的指針是否爲空。學習
而後把head->next 這個位置的數據取出來,取出來後,再把head->next的指針指向 取出來這個位置 的next 位置。spa
而後再記得free掉。就Ok了。指針
入棧的操做和出棧的操做恰好相反,就是改變一下位置和指針的指向。code
int StackPush(struct Stack *stack,int data) { struct List *tmp = (struct List *)malloc(sizeof(struct List)); tmp->data = data; tmp->next = stack->head->next; stack->head->next = tmp; stack->size++; //printf("push:%d \n",data); return 0; }
數組自己是一種數據結構,使用數組實現一個棧也是很是簡單方便的,你們請看。
#include "stdio.h" #include "stdlib.h" /*棧的大小*/ #define LENGHT (100) struct Stack{ int stack_array[LENGHT]; unsigned int size;//棧動態長度 }; struct Stack * StackInit(void) { struct Stack *stack = NULL; stack = (struct Stack*)malloc(sizeof(struct Stack)); stack->size = 0; return stack; } int StackPush(struct Stack *stack,int data) { if(stack->size >= LENGHT) { printf("stack is full\n"); return (-1); } stack->stack_array[stack->size] = data; stack->size++; //printf("push:%d size:%d\n",data,stack->size); return 0; } int IsStackEmpty(struct Stack *stack) { /*若是頭指針指向下一個爲空,說明棧爲空*/ if(stack->size == 0) return 1; else return 0; } int StackPop(struct Stack *stack,int *data) { stack->size--; if(IsStackEmpty(stack)) return -1; *data = stack->stack_array[stack->size]; //printf("pop:%d size:%d\n",*data,stack->size); return 0; } int main(void) { int i = 0; struct Stack *stack = NULL; stack = StackInit(); for(i = 0;i<20;i++) { StackPush(stack,i); } for(i = 0;i<21;i++) { int data = 0; StackPop(stack,&data); printf("%d \n",data); } printf("\n"); return 0; }
既然有棧,就會有和棧不同的數據結構,有一種數據結構叫作隊列,棧的數據結構特色是先進後出,隊列的數據結構特色是先進先出,有點意思,棧和隊列作驅動的同窗不多須要本身寫代碼實現,正常狀況下都是SDK集成了方法,直接調用接口就行了,可是寫應用的同窗,常常要本身實現一個棧或者隊列,特別是大企業面試,這些算是很是基礎的題目,最好是閉着眼睛就能寫出來的那種。
若是你想快速掌握C/C++編程,小編推薦個人C語言/C++編程學習基地【點擊進入】!
都是學編程小夥伴們,帶你入個門仍是簡簡單單啦,一塊兒學習,一塊兒加油~
涉及:編程入門、遊戲編程、windows編程、Linux編程、Qt、黑客等等......