1. 程式人生 > >資料結構-棧的靈活表示方式(棧頂指標和棧底指標)

資料結構-棧的靈活表示方式(棧頂指標和棧底指標)

在前面的文章中我們已經學習過基本棧的概念和操作,我們是通過“標準方式”陣列的形式模擬了一個棧;本篇文章我將通過一種更靈活的方式定義棧以及實現棧的基本操作,廢話不多說,直接上程式碼(註釋都有說明哦)

//棧的靈活表示法,通過定義棧頂指標和棧底指標的方式

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

#define ElementType int
#define MaxSize 10

//定義棧的結構體
typedef struct {
    ElementType *top;//棧頂指標(這裡定義為指向棧頂元素的下一個位置,即為空)
    ElementType *base;//棧底指標
    int stackSize;//棧的容量
} Stack;

/**
 *  初始化棧
 * @param s
 */
void InitStack(Stack *s) {
    //初始化分配棧的總空間
    s->base = (ElementType *) malloc(MaxSize * sizeof(ElementType));
    if (!s->base) {
        exit(0);
    }
    s->top = s->base;
    s->stackSize = MaxSize;
}

/**
 * 入棧
 * @param s 棧
 * @param e 入棧元素
 */
void Push(Stack *s, ElementType e) {
    //判斷棧是否已滿
    ElementType p = s->top - s->base;
    if (p >= MaxSize) {
        //棧已滿
        //處理方式1.遞增空間 2.退出
        exit(0);
    }
    *(s->top) = e;//賦值
    s->top++;//棧頂指標上移
}

/**
 * 出棧
 * @param s 棧
 * @return
 */
ElementType Pop(Stack *s) {
    //判斷棧是否為空
    if (s->top == s->base) {
        //棧為空
        printf("不好意思,棧目前為空~");
        exit(0);
    }
    s->top--;//棧頂指標下移
    ElementType e = *(s->top);//取值,並不是取地址
    return e;
}

/**
 * 棧大小
 * @param s 棧
 * @param len
 */
ElementType GetLen(Stack s) {
    return (s.top - s.base);
}

/**
 * 清空棧
 * @param s
 */
void ClearStack(Stack *s) {
    s->top = s->base;
}

/**
 * 銷燬棧
 * @param s
 */
void DestoryStack(Stack *s) {
    s->top = s->base;
    free(s->base);
    s->stackSize = 0;
}

int main() {
    printf("Hello, World!\n");
    Stack stack;
    int len;
    InitStack(&stack);
    len = GetLen(stack);
    printf("當前棧長度 len=%d\n", len);
    int temp = 10;
    int value;
    printf("入棧 value=%d\n", temp);
    Push(&stack, temp);
    len = GetLen(stack);
    printf("當前棧長度 len=%d\n", len);
    value = Pop(&stack);
    printf("出棧 value=%d\n", value);
    len = GetLen(stack);
    printf("出棧後棧長度 len=%d\n", len);
    return 0;
}