棧1: 順序儲存

HIK4RU44發表於2024-04-18

棧: 順序儲存


棧是一種先進後出(First In Last Out,FILO)的資料結構

如果你將兩個元素壓入棧,先加入的元素將在後加入的元素之後出棧


棧頂元素值為null(未滿時)


定義棧的資料結構

#define MAX_SIZE 1024
//利用陣列模擬棧的順序儲存
typedef struct sqStack{
    void *data[MAX_SIZE];
    int size; //棧的元素數量
} sqStack;

初始化

sqStack* initStack(){
    sqStack *s = (sqStack*)malloc(sizeof(sqStack));
    for (int i = 0; i < MAX_SIZE; i++){
        s->data[i] = NULL;
    }
    s->size = 0;
    return s;
};

入棧

void PushStack(sqStack *s, void* data){
    if(s==NULL) return; //如果棧為空
    if(s->size==MAX_SIZE) return; //如果棧已滿
    if(data==NULL) return; //如果插入資料為null

    s->data[s->size] = data;
    s->size++;
};

返回棧頂元素

void* topSqStack(sqStack *s){
    if(s==NULL) return NULL; 
    if(s->size==0) return NULL;

    return s->data[(s->size-1)]; //第一個元素在棧頂之下
};

彈出棧頂元素

void* PopStack(sqStack *s){
    if(s==NULL) return NULL; 
    if(s->size==0) return NULL; 

    s->data[s->size-1] = NULL; //將元素彈出 
    s->size--; //棧頂下移
};

判斷棧是否為空

int ifEmpty_Stack(sqStack *s){
    if(s==NULL) return -1; //SQstack_ERROR
    if(s->size==0) return 1; //SQStack_TRUE
    return 2; //SQStack_FALSE
};

返回棧中的元素個數

int Size_Stack(sqStack *s){
    if(s==NULL) return -1;
    return s->size;
};

清空棧

void clear_Stack(sqStack *s){
    if(s==NULL) return; 
    if(s->size==0) return; 
    for (int i = 0; i < s->size; i++){
        s->data[i] = NULL; //清空所有資料
    }
    s->size=0;
};

銷燬棧

void destroy_Stack(sqStack *s){
    if(s==NULL) return;  
    free(s);
};

棧順序儲存的測試

定義棧中元素的資料結構

typedef struct PERSON{
    char name[64];
    int age;
} Person;

測試

int main(){
    //建立棧
    sqStack* stack = initStack();
    //建立資料
    Person p1 = {"aaa",10};
    Person p2 = {"bbb",20};
    Person p3 = {"ccc",30};
    Person p4 = {"ddd",40};
    //進棧
    PushStack(stack, &p1);
    PushStack(stack, &p2);
    PushStack(stack, &p3);
    PushStack(stack, &p4);
    //輸出
    while(Size_Stack(stack)>0){
        //訪問棧頂元素
        Person* person = (Person*)topSqStack(stack);
        cout << person->name << " " << person->age << endl;
        //彈出棧頂元素
        PopStack(stack);
    }
    //釋放記憶體
    destroy_Stack(stack);

    system("pause");
    return 0;
}

返回元素的順序與壓入的順序相反(先進後出)

相關文章