什么是資料結構?
資料結構是什么?要了解資料結構,我們要先明白資料和結構,資料就是一些int char 這樣的變數,這些就是資料,如果你是一個籃球愛好者,那么你的球鞋就是你的資料,結構就是怎么把這些資料排列組合,怎么把資料擺放好才能方便你找到這些資料,把資料和結構合在一起理解就是所謂的資料結構,簡單點,就是處理資料的方式方法,
平時在家里面,你有沒有隨便擺放自己的鞋子,然后要找鞋子的時候要花費非常多是時間,可能你老婆也很生氣,每天都亂擺鞋子導致她打掃衛生非常麻煩,然后有一天,你買了一個非常酷的鞋架,有了這個鞋架之后,你的鞋子終于有家了,這個鞋架就是起到處理鞋子的作用了,
什么是堆疊?
堆疊可以理解為資料結構中的一種,這種資料結構的特點是先進去的人「資料」后出來,就像下面的圖片一樣,如果堆疊是一個洞,人「資料」只能從洞的一個口進去,然后出來也只能從一個口出來,而且洞的寬度就只能容納一個人「資料」,好了,那先進去的那個人「資料」最傻逼了,一定要等后面進來的人「資料」都先出去了才能出去,
用 C 語言實作一個堆疊
我寫代碼是很水的,之前有一個同學寫了一個堆疊讓我檢查,我看了下,好像我寫代碼的能力比他厲害一些,代碼比較簡單,然后講一下幾個比較重要的函式,希望大家在面試的時候,隨手就甩出一個堆疊“砸死”面試官,哈哈,
#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 =https://www.cnblogs.com/huya-edu/p/ 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 = https://www.cnblogs.com/huya-edu/p/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 = https://www.cnblogs.com/huya-edu/p/0; StackPop(stack,&data); printf("%d ",data); } printf("\n"); return 0; }
1- 堆疊頭部
堆疊頭部,也就是堆疊頂指標,我們用指標單鏈表實作一個堆疊,一定要知道這個堆疊頂的指標,有頭就有堆疊,沒有頭,這個堆疊也就跨了,
struct Stack *stack = NULL; stack = StackInit();
這個就是定義一個堆疊,也就是malloc出來一個記憶體,專門存這個堆疊頂的,
2- 出堆疊
出堆疊的方法跟我之前說的差不多,只不過出堆疊代碼上需要做判斷,
int StackPop(struct Stack *stack,int *data) { struct List *tmp = NULL; if(IsStackEmpty(stack)) return -1; tmp = stack->head->next; *data = https://www.cnblogs.com/huya-edu/p/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 位置,
然后再記得free掉,就Ok了,
3- 入堆疊
入堆疊的操作和出堆疊的操作剛好相反,就是改變一下位置和指標的指向,
int StackPush(struct Stack *stack,int data) { struct List *tmp = (struct List *)malloc(sizeof(struct List)); tmp->data =https://www.cnblogs.com/huya-edu/p/ 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 = https://www.cnblogs.com/huya-edu/p/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 = https://www.cnblogs.com/huya-edu/p/0; StackPop(stack,&data); printf("%d \n",data); } printf("\n"); return 0; }
總結
既然有堆疊,就會有和堆疊不一樣的數據結構,有一種資料結構叫做佇列,堆疊的資料結構特點是先進后出,佇列的資料結構特點是先進先出,有點意思,堆疊和佇列做驅動的同學很少需要自己寫代碼實作,正常情況下都是SDK集成了方法,直接呼叫介面就好了,但是寫應用的同學,經常要自己實作一個堆疊或者佇列,特別是大企業面試,這些算是非常基礎的題目,最好是閉著眼睛就能寫出來的那種,

如果你想快速掌握C/C++編程,小編推薦我的C語言/C++編程學習基地【點擊進入】!

都是學編程小伙伴們,帶你入個門還是簡簡單單啦,一起學習,一起加油~
涉及:編程入門、游戲編程、windows編程、Linux編程、Qt、黑客等等......

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/99147.html
標籤:C
上一篇:學習第32天
