數據結構—棧的實現(順序表)

數據結構中的棧有“後進先出”的特點,意思是最後被存進棧中的數據,總是最早被取走

一個棧只有初始化,銷燬,入棧,出棧和取棧頂元素,這些限制往往使在操作數據時更安全,代碼容易實現,出現BUG的機會就很少


上圖中,棧中有3個元素,棧頂元素是data3,如果是入棧操作則data4放入棧頂,此時棧中有四個元素,棧頂元素是data4,如果出棧,則data4被取出,棧頂元素變爲data3,具體實現代碼如下:

頭文件(SeqStack.h):

#pragma once

#include<stdio.h>
#include<stdlib.h>

typedef char StackType;

typedef struct SeqStack{
    StackType* space;    //該指針指向一段向堆申請的空間
    size_t size;         //棧的元素個數
    size_t max_size;     //棧的最大存儲元素個數
}SeqStack;

void SeqStackInit(SeqStack* stack);  //棧的初始化

void SeqStackDestroy(SeqStack* stack);  //銷燬棧

void SeqStackPush(SeqStack* stack, StackType value); //入棧

void SeqStackPop(SeqStack* stack); //出棧

int SeqStackTop(SeqStack* stack, StackType* output_value);  //去棧頂元素


頭文件的實現(SeqStack)

#include"SeqStack.h"

void SeqStackInit(SeqStack* stack){
    if(stack == NULL) {
        return;
    }
    stack->size = 0;
    stack->max_size = 1000;
    stack->space = malloc(stack->max_size * sizeof(StackType));
}

void SeqStackDestroy(SeqStack* stack) {
    if(stack == NULL) {
        return;
    }
    free(stack->space);
    stack->space = NULL;
    stack->size = 0;
    stack->max_size = 0;
}

void SeqStackPush(SeqStack* stack, StackType value) {
    if(stack == NULL) {
        return;
    }
    stack->space[stack->size] = value;
    stack->size++;
    if(stack->size >= stack->max_size) {         //當棧被填滿時,申請一個更大的空間,並把原來棧中的數據複製過去,銷燬原來的棧,使用新棧
        stack->max_size = stack->max_size * 2 + 1;
        SeqStack* new_stack = malloc(stack->max_size * sizeof(SeqStack));
        int i = 0;
        for(; i < stack->size; i++) {
            new_stack->space[i] = stack->space[i];            
        }
        SeqStackDestroy(stack);
        stack = new_stack;
    }
}

void SeqStackPop(SeqStack* stack) {
    if(stack == NULL) {
        return;
    }
    stack->size--;
}

int SeqStackTop(SeqStack* stack, StackType* output_value) {
    if(stack == NULL || output_value == NULL) {
        return 0;
    }
    if(stack->size == 0){
        return 0;
    }
    *output_value = stack->space[stack->size];
    return 1;
}

/////////////////////////////////////////////////////////////////
//以下爲測試代碼
/////////////////////////////////////////////////////////////////
void TestSeqStack() {
    SeqStack stack;
    SeqStackInit(&stack);
    printf("stack->space expected NULL, actual %p\n", stack.space);
    printf("stack->size expected 0, actual %d\n", stack.size);

    SeqStackPush(&stack, 'a');
    SeqStackPush(&stack, 'b');
    SeqStackPush(&stack, 'c');
    SeqStackPush(&stack, 'd');
    printf("stack->size expected 4, actual %d\n", stack.size);
    
    StackType value;
    int ret;
    ret = SeqStackTop(&stack, &value);
    printf("stack->space expected d, actual %c\n", stack.space[stack.size-1]);
    printf("stack->size expected 1, actual %d\n", ret);
    SeqStackPop(&stack);

    ret = SeqStackTop(&stack, &value);
    printf("stack->space expected c, actual %c\n", stack.space[stack.size-1]);
    printf("stack->size expected 1, actual %d\n", ret);
    SeqStackPop(&stack);

    ret = SeqStackTop(&stack, &value);
    printf("stack->space expected b, actual %c\n", stack.space[stack.size-1]);
    printf("stack->size expected 1, actual %d\n", ret);
    SeqStackPop(&stack);

    ret = SeqStackTop(&stack, &value);
    printf("stack->space expected a, actual %c\n", stack.space[stack.size-1]);
    printf("stack->size expected 1, actual %d\n", ret);
    SeqStackPop(&stack);

    ret = SeqStackTop(&stack, &value);
    printf("stack->space expected 0, actual %d\n", stack.space[stack.size-1]);
    printf("stack->size expected 0, actual %d\n", ret);
}


int main(){
    TestSeqStack();
    return 0;
}

實驗結果:



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章