生活随笔
收集整理的這篇文章主要介紹了
栈的顺序存储及实现(二)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
棧的介紹
棧(stack)是限定僅在表尾進(jìn)行插入和刪除操作的線性表 。 我們把允許插入和刪除的一端稱為棧頂(top),另一端稱為棧底(bottom),不含任何數(shù)據(jù)元素的棧稱為空棧。棧又被稱為后進(jìn)先出(LastIn First Out)的線性表,簡稱LIOF結(jié)構(gòu)。 首先它是一個線性表,也就是說,棧元素具有線性關(guān)系,即前驅(qū)后繼關(guān)系。只不過它是一種特殊的線性表而已 。
代碼實(shí)現(xiàn)
棧一般的實(shí)現(xiàn)都是用順序存儲結(jié)構(gòu)進(jìn)行實(shí)現(xiàn)的,上次我們在棧的順序存儲結(jié)構(gòu)及實(shí)現(xiàn)(一)采用的數(shù)組進(jìn)行實(shí)現(xiàn),但是數(shù)組有個瓶頸就是固定了棧的長度 ,這次我們才采用動態(tài)獲取內(nèi)存空間,當(dāng)壓棧時如果棧滿進(jìn)行動態(tài)的擴(kuò)充容量,進(jìn)行棧的實(shí)現(xiàn) 。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define STACK_INIT_SIZE 5
#define STACK_INCREMENT 5
typedef int Status;
typedef int EleType;typedef struct SeqStack
{EleType* top;//棧頂指針EleType* base;//棧底指針int stackSize;//棧容量
}SeqStack;
//初始化棧
Status InitStack(SeqStack* stack)
{//開辟空間stack->base = stack->top = (EleType*)malloc(STACK_INIT_SIZE*sizeof(EleType));if (!stack->base){exit(0);}return OK;
}
/*
清空棧
*/
Status ClearStack(SeqStack* stack) {if (NULL == stack) {return ERROR;}//清空棧 實(shí)質(zhì)上是忽略棧中數(shù)據(jù),可以再次使用內(nèi)存單元stack->top = stack->base;return OK;
}
/*
銷毀棧
*/
Status DestroyStack(SeqStack* stack)
{if (NULL == stack) {return ERROR;}//銷毀棧 是釋放棧在內(nèi)存中占用的空間資源if (!stack->base){free(stack->base);}stack->top = stack->base = NULL;stack->stackSize = 0;return OK;
}
//獲取棧長度(棧中元素個數(shù))
int LengthStack(SeqStack stack)
{return stack.top - stack.base;
}
//壓棧
Status push(SeqStack* stack,EleType e)
{if (stack == NULL){return ERROR;}//壓棧之前檢測容量是否足夠if (stack->top - stack->base == stack->stackSize){//超出容量 進(jìn)行擴(kuò)容,使用realloc函數(shù),會拷貝原內(nèi)存內(nèi)容stack->base = (SeqStack*)realloc(stack->base, stack->stackSize+STACK_INCREMENT);if (!stack->base){exit(0);}stack->top = stack->base + stack->stackSize;stack->stackSize += STACK_INCREMENT;}*stack->top = e;stack->top++;return OK;
}
//彈棧
Status pop(SeqStack* stack, EleType *e)
{if (stack == NULL || e == NULL){return ERROR;}//空棧if (stack->top == stack->base){return ERROR;}*stack->top--;*e = *stack->top;return OK;
}
/*
判斷棧是否為空
*/
int IsEmptyStack(SeqStack* stack) {if (NULL == stack) {return ERROR;}if (stack->top == stack->base) {return TRUE;}return FALSE;
}
/*
獲取棧頂元素
*/
Status GetTop(SeqStack* stack, EleType *e) {if (NULL == stack) {return ERROR;}*e = *(stack->top - 1);return OK;
}
/*
從棧頂向下展示元素值
*/
Status ShowStack(SeqStack* stack) {if (NULL == stack || stack->top == stack->base) {return ERROR;}EleType *top = stack->top;while (top != stack->base){top--;printf("%d\n", *top);}return OK;
}
int main(int argc, char *argv[])
{SeqStack stack;//創(chuàng)建順序棧InitStack(&stack);//初始化printf("壓入元素5,4,3,2,1\n");push(&stack, 5);push(&stack, 4);push(&stack, 3);push(&stack, 2);push(&stack, 1);puts("棧元素展示:");ShowStack(&stack);puts("彈出2個元素后");puts("棧元素展示:");EleType e1, e2,e3;pop(&stack, &e1);pop(&stack, &e2);ShowStack(&stack);printf("彈出元素為:%d,%d\n", e1, e2);//測試是否動態(tài)擴(kuò)充容量push(&stack,8);push(&stack,9);push(&stack,10);printf("壓入元素8,9,10\n");puts("棧元素展示:");ShowStack(&stack);GetTop(&stack, &e3);printf("棧頂元素為:%d\n", e3);DestroyStack(&stack);return 0;
}
運(yùn)行結(jié)果
總結(jié)
以上是生活随笔 為你收集整理的栈的顺序存储及实现(二) 的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔 推薦給好友。