日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

栈的顺序存储及实现(二)

發(fā)布時(shí)間:2025/3/15 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 栈的顺序存储及实现(二) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

棧的介紹


棧(stack)是限定僅在表尾進(jìn)行插入和刪除操作的線性表。
我們把允許插入和刪除的一端稱(chēng)為棧頂(top),另一端稱(chēng)為棧底(bottom),不含任何數(shù)據(jù)元素的棧稱(chēng)為空棧。棧又被稱(chēng)為后進(jìn)先出(LastIn First Out)的線性表,簡(jiǎn)稱(chēng)LIOF結(jié)構(gòu)。
首先它是一個(gè)線性表,也就是說(shuō),棧元素具有線性關(guān)系,即前驅(qū)后繼關(guān)系。只不過(guò)它是一種特殊的線性表而已
。

代碼實(shí)現(xiàn)


棧一般的實(shí)現(xiàn)都是用順序存儲(chǔ)結(jié)構(gòu)進(jìn)行實(shí)現(xiàn)的,上次我們?cè)跅5捻樞虼鎯?chǔ)結(jié)構(gòu)及實(shí)現(xiàn)(一)采用的數(shù)組進(jìn)行實(shí)現(xiàn),但是數(shù)組有個(gè)瓶頸就是固定了棧的長(zhǎng)度這次我們才采用動(dòng)態(tài)獲取內(nèi)存空間,當(dāng)壓棧時(shí)如果棧滿進(jìn)行動(dòng)態(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) {//開(kāi)辟空間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; } /* 銷(xiāo)毀棧 */ Status DestroyStack(SeqStack* stack) {if (NULL == stack) {return ERROR;}//銷(xiāo)毀棧 是釋放棧在內(nèi)存中占用的空間資源if (!stack->base){free(stack->base);}stack->top = stack->base = NULL;stack->stackSize = 0;return OK; } //獲取棧長(zhǎng)度(棧中元素個(gè)數(shù)) int LengthStack(SeqStack stack) {return stack.top - stack.base; } //壓棧 Status push(SeqStack* stack,EleType e) {if (stack == NULL){return ERROR;}//壓棧之前檢測(cè)容量是否足夠if (stack->top - stack->base == stack->stackSize){//超出容量 進(jìn)行擴(kuò)容,使用realloc函數(shù),會(huì)拷貝原內(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個(gè)元素后");puts("棧元素展示:");EleType e1, e2,e3;pop(&stack, &e1);pop(&stack, &e2);ShowStack(&stack);printf("彈出元素為:%d,%d\n", e1, e2);//測(cè)試是否動(dòng)態(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é)

以上是生活随笔為你收集整理的栈的顺序存储及实现(二)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。