1. 程式人生 > >C語言實現棧(基於陣列)

C語言實現棧(基於陣列)

棧是一種操作受限的資料結構,只允許從一段操作,而且先進後出(FILO  first in last out)這裡將棧的操作封裝在C語言的標頭檔案裡

實現棧的程式碼如下

#include<stdbool.h>
#define maxsize 10
typedef int datatype;

//Sequence Stack 實現順序棧,使用陣列來實現
struct stack
{
    datatype data[maxsize];
    int top;
};

typedef struct stack Stack;
//建立棧

Stack s;
//初始化棧
void init()
{
    s.top=-1;
}

//判斷棧是否為空
bool Empty()
{
    if(s.top==-1)
    {
        return true;
    }
    else
    {
        return false;
    }
}

//判斷棧是否已滿了
bool full()
{
    if(s.top==maxsize-1)
    {
        return true;
    }
    else
    {
        return false;
    }
}

//入棧
void Push(datatype element)
{
    if(!full())
    {
        s.top++;
        s.data[s.top]=element;
    }
    else
    {
        printf("棧滿\n");
    }
}

//出棧
void Pop()
{
    if(!Empty())
    {
        s.top--;
    }
    else
    {
        printf("棧空\n");
    }
}

//取棧頂元素
datatype Top()
{
    if(!Empty())
    {
        return s.data[s.top];
    }
    else
    {
        printf("棧空\n");
    }
}

//銷燬棧
void Destroy()
{
    s.top=-1;
}

測試棧的程式碼如下:

#include<stdio.h>
#include "SequenceStack.h"
int main()
{
    int i=0;
    // struct stack s;
    //初始化棧
    printf("\n###########初始化棧###########\n");
    init();
    printf("----------------------------------");    
    //入棧操作
    printf("\n###########入棧操作###########\n");
    for(i=0;i<=10;i++)
    {
        Push(i);
    }
    printf("----------------------------------");
    printf("\n###########取棧頂元素###########\n");
    printf("%d\n",Top());
    printf("----------------------------------");    
    //出棧操作
    printf("\n###########出棧操作###########\n");
    for(i=0;i<=10;i++)
    {
        Pop();
    }  
    printf("----------------------------------");    
    printf("\n###########取棧頂元素###########\n");
    Top();
    printf("----------------------------------");
    printf("\n###########銷燬棧###########\n"); 
    Push(10);
    Destroy();
    Top();
}

這樣實現棧,巨集定義處maxsize表示棧的大小,方便以後修改,typedef也是同樣的效果,可以隨時改變資料型別。

在操作棧的時候也只要用到push、pop、top、等方法就可以了

這樣的棧有一個明顯的缺點,是棧被定義在標頭檔案裡,這樣使用者只能使用一個棧,無法同時建立兩個棧,考慮到這一點,對棧的程式碼做出修改

實現棧的程式碼

#include<stdbool.h>
#define maxsize 10
typedef int datatype;

//Sequence Stack 實現順序棧,使用陣列來實現
struct stack
{
    datatype data[maxsize];
    int top;
};

typedef struct stack Stack;
//建立棧

// Stack s;
//初始化棧
void init(Stack *s)
{
    s->top=-1;
}

//判斷棧是否為空
bool Empty(Stack *s)
{
    if(s->top==-1)
    {
        return true;
    }
    else
    {
        return false;
    }
}

//判斷棧是否已滿了
bool full(Stack *s)
{
    if(s->top==maxsize-1)
    {
        return true;
    }
    else
    {
        return false;
    }
}

//入棧
void Push(Stack *s,datatype element)
{
    if(!full(s))
    {
        s->top++;
        s->data[s->top]=element;
    }
    else
    {
        printf("棧滿\n");
    }
}

//出棧
void Pop(Stack *s)
{
    if(!Empty(s))
    {
        s->top--;
    }
    else
    {
        printf("棧空\n");
    }
}

//取棧頂元素
datatype Top(Stack *s)
{
    if(!Empty(s))
    {
        return s->data[s->top];
    }
    else
    {
        printf("棧空\n");
    }
}

//銷燬棧
void Destroy(Stack *s)
{
    s->top=-1;
}


測試棧的程式碼

#include<stdio.h>
#include "SequenceStack1.0.h"
int main()
{
    int i=0;
    Stack p; 
    Stack *s;
    s=&p;
    // struct stack s;
    //初始化棧
    printf("\n###########初始化棧###########\n");
    init(s);
    printf("----------------------------------");    
    //入棧操作
    printf("\n###########入棧操作###########\n");
    for(i=0;i<=10;i++)
    {
        Push(s,i);
    }
    printf("----------------------------------");
    //取棧頂元素
    printf("\n###########取棧頂元素###########\n");
    printf("%d\n",Top(s));
    printf("----------------------------------");    
    //出棧操作
    printf("\n###########出棧操作###########\n");
    for(i=0;i<=12;i++)
    {
        Pop(s);
    }  
    printf("----------------------------------");
    //取棧頂元素    
    printf("\n###########取棧頂元素###########\n");
    Top(s);
    printf("----------------------------------");
    //銷燬棧
    printf("\n###########銷燬棧###########\n"); 
    Push(s,10);
    Destroy(s);
    Top(s);
}

這裡可以在主函式中自己定義棧,從而同時實現多個棧,但是這樣的棧還是大小固定的,每次修改maxsize很麻煩,所以想到malloc函式,對棧的程式碼做了進一步的修改

實現棧的程式碼

#include<stdbool.h>
#include<stdlib.h>
#define maxsize 10
typedef int datatype;

//Sequence Stack 實現順序棧,使用陣列來實現
struct stack
{
    datatype *data;
    int top;
};

typedef struct stack Stack;
//建立棧

int realsize=maxsize;

// Stack s;
//初始化棧
void init(Stack *s)
{
    s->data = (datatype *)malloc(sizeof(datatype)*maxsize);
    s->top=-1;
}

//判斷棧是否為空
bool Empty(Stack *s)
{
    if(s->top==-1)
    {
        return true;
    }
    else
    {
        return false;
    }
}

//判斷棧是否已滿了
void full(Stack *s)
{
    if(s->top==realsize-1)
    {
        realsize++;
        s->data=(datatype *)realloc(s->data,realsize*sizeof(datatype));
    }
}

//入棧
void Push(Stack *s,datatype element)
{
    full(s);
    s->top++;
    s->data[s->top]=element;
}

//出棧
void Pop(Stack *s)
{
    if(!Empty(s))
    {
        s->top--;
    }
    else
    {
        printf("棧空\n");
    }
}

//取棧頂元素
datatype Top(Stack *s)
{
    if(!Empty(s))
    {
        return s->data[s->top];
    }
    else
    {
        printf("棧空\n");
    }
}

//銷燬棧
void Destroy(Stack *s)
{
    s->top=-1;
    free(s->data); //釋放堆上記憶體
}

測試棧的程式碼

#include<stdio.h>
#include "DynamicStack1.0.h"
int main()
{
    int i=0;
    Stack p; 
    Stack *s;
    s=&p;
    // struct stack s;
    //初始化棧
    printf("\n###########初始化棧###########\n");
    init(s);
    printf("----------------------------------");    
    //入棧操作
    printf("\n###########入棧操作###########\n");
    for(i=0;i<=10;i++)
    {
        Push(s,i);
    }
    printf("----------------------------------");
    //取棧頂元素
    printf("\n###########取棧頂元素###########\n");
    printf("%d\n",Top(s));
    printf("----------------------------------");    
    //出棧操作
    printf("\n###########出棧操作###########\n");
    for(i=0;i<=12;i++)
    {
        Pop(s);
    }  
    printf("----------------------------------");
    //取棧頂元素    
    printf("\n###########取棧頂元素###########\n");
    Top(s);
    printf("----------------------------------");
    //銷燬棧
    printf("\n###########銷燬棧###########\n"); 
    Push(s,10);
    Destroy(s);
    Top(s);
}

這樣就可以實現無限大小的棧了,這裡realloc之後的指標,在free的時候容易出錯