資料結構-棧的靈活表示方式(棧頂指標和棧底指標)
阿新 • • 發佈:2019-01-25
在前面的文章中我們已經學習過基本棧的概念和操作,我們是通過“標準方式”陣列的形式模擬了一個棧;本篇文章我將通過一種更靈活的方式定義棧以及實現棧的基本操作,廢話不多說,直接上程式碼(註釋都有說明哦)
//棧的靈活表示法,通過定義棧頂指標和棧底指標的方式 #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; }