---恢復內容開始---
堆棧、隊列是整個數據結構的重要基礎,這里總結了用鏈表和數組來實現堆、隊列的創立,出隊、入隊、出棧、入棧的過程。
思路總結:
首先是堆棧,堆棧具有先進后出的特點,實現的思路有兩種,其一是利用結體中的數組,預設好最大值,然后對結構體內的堆棧值進行操作。
先來嘗試鏈表方法:
首先聲明一個結構體以及要去實現的出棧入棧函數:
typedef struct example{ int data; struct example *pNext; }STACK,* PSTACK; int Pushstakc(PSTACK,int);//入棧 int Popstack(PSTACK);//出棧 PSTACK crateStack();//建立一個棧
然后下面是具體的函數操作:
1 PSTACK crateStack(){//聲明一個堆棧 2 PSTACK stack; 3 stack=(PSTACK)malloc(sizeof(STACK)); 4 stack->pNext=NULL; 5 stack->data=NULL; 6 return(stack); 7 } 8 int Pushstakc(PSTACK stack,int numb){//實現入棧 9 PSTACK TemStack; 10 TemStack=(PSTACK)malloc(sizeof(STACK));//聲明一個臨時鏈表,將要入棧的數據存放進去 11 TemStack->data=numb; 12 TemStack->pNext=stack->pNext;//將數據入棧 13 stack->pNext=TemStack;//重新構建指針指向 14 return(1); 15 } 16 int Popstack(PSTACK stack){//實現出棧 17 PSTACK TempStack;int TempNumber; 18 if(stack->pNext==NULL){//判別是否是一個空棧 19 puts("no stack to pop"); 20 return(0); 21 } 22 TempStack=stack->pNext; 23 stack->pNext=TempStack->pNext;//出棧,與入棧同理 24 TempNumber=TempStack->data; 25 free(TempStack);//將臨時空間釋放 26 return(TempNumber); 27 }
另一種方法是通過數組來實現堆棧的創立:
首先聲明一個結構體及其函數:
1 typedef struct example{ 2 int top;//代替指針,表明棧的高度 3 int Maxsize; 4 int *data; 5 }STACK,* PSTACK; 6 PSTACK createStack(int); 7 int PushStack(PSTACK,int); 8 int PopStack(PSTACK);
下面是函數實現的具體過程:
1 PSTACK createStack(int maxsize){ 2 PSTACK stack; 3 stack=(PSTACK)malloc(sizeof(STACK)); 4 if(stack==NULL) 5 return(0); 6 stack->Maxsize=maxsize; 7 stack->data=(int *)malloc(maxsize * sizeof(int)); 8 stack->top=-1;//初始化TOP值為1 9 return(stack); 10 } 11 int PushStack(PSTACK stack,int numb){ 12 if(stack->top==stack->Maxsize){ 13 puts("full!"); 14 return(0); 15 } 16 stack->top++; 17 stack->data[stack->top]=numb; 18 return(1); 19 } 20 int PopStack(PSTACK stack){ 21 if(stack->top==-1){ 22 puts("NO MORE DATA!"); 23 return(0); 24 } 25 return(stack->data[(stack->top)--]); 26 }
隊列的思路和棧不一樣,一個是最基本的先進先出特點不一樣,其次是,構建一個環形隊列,需要兩個指標,一個是表示隊列頭部的Front,和表示隊列尾部的Rear(這里的代碼把rear和Front寫反了)
首先仍然是聲明一個結構體和相關函數:
1 #include <stdio.h> 2 #include <stdlib.h> 3 typedef struct example{ 4 int *data; 5 int Front; 6 int rear; 7 int CurrentSize;//用於判斷隊列是否滿了 8 int MaxSize; 9 }STACK,* PSTACK; 10 int PushStack(PSTACK,int); 11 PSTACK creatPstack(int); 12 int PopStack(PSTACK);
對於一個普通的循環隊列來說,我們認為如果REAR=Front則隊列滿了,然而實際上這也可能是一個空隊列,針對這樣的情況我們認為可以通過倆個方法,一個是減少隊列個事,使得首位不相交,另一個方法是設立一個CurrenSize指標,記錄隊列的大小,為了更加方便理解,這里使用了SIZE指標而非前者。
1 STACK creatPstack(int numb){ 2 PSTACK stack; 3 stack=(PSTACK)malloc(sizeof(STACK)); 4 stack->data=(int * )malloc(numb * sizeof(int)); 5 stack->Front=NULL; 6 stack->rear=NULL; 7 stack->MaxSize=numb; 8 } 9 int PushStack(PSTACK stack,int numb){ 10 if(stack->Front==stack->MaxSize){ 11 puts("reach the max capability"); 12 return(0); 13 } 14 stack->rear=(stack->rear++)%(stack->MaxSize);//用這種方式可以輕松解決了在遇到6變成0的情況 15 stack->data[stack->rear]=numb; 16 return(1); 17 } 18 int PopStack(PSTACK stack){ 19 int TempNumber; 20 if(stack->MaxSize==0){ 21 puts("it is empty!"); 22 return(0); 23 } 24 stack->Front=(stack->Front++)%(stack->MaxSize); 25 TempNumber=stack->data[stack->Front]; 26 return(TempNumber); 27 }