學習整理:堆棧和隊列——數組、鏈表的基礎實現


---恢復內容開始---

堆棧、隊列是整個數據結構的重要基礎,這里總結了用鏈表和數組來實現堆、隊列的創立,出隊、入隊、出棧、入棧的過程。

思路總結:

首先是堆棧,堆棧具有先進后出的特點,實現的思路有兩種,其一是利用結體中的數組,預設好最大值,然后對結構體內的堆棧值進行操作。

先來嘗試鏈表方法:

首先聲明一個結構體以及要去實現的出棧入棧函數:

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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM