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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

两栈共享存储空间算法

發(fā)布時間:2025/3/15 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 两栈共享存储空间算法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

我們知道棧是一種先進(jìn)后出的結(jié)構(gòu),我們用順序存儲結(jié)構(gòu)進(jìn)行實現(xiàn),也是很方便的,唯一的缺陷就是必須事先確定數(shù)組存儲空間大小,萬一不夠用了,就需要編程手段擴(kuò)展數(shù)組容量,非常麻煩。對于一個棧,我們只能經(jīng)理設(shè)計出合適大小的數(shù)組進(jìn)行處理,但是對于2個相同類型的棧,我們可以共享其存儲空間,最大限度的利用事先開辟的存儲空間進(jìn)行操作。


關(guān)鍵思路:他們是數(shù)組的兩端,向中間靠攏。top1和top2是棧和棧2的棧頂指針,可以想象,只要他們倆不見面,2個棧就可以一直使用。2棧見面時,也就是2個指針之間相差1時,即top1+1 == top為棧滿。

對于2棧共享空間的push方法,我們除了要插入元素值參數(shù)外,我們還需要判斷是棧1還是棧2的棧號參數(shù)stackNumber.注意:先判斷棧滿沒有,先棧頂top+1后,然后在相應(yīng)棧頂賦值。

對于2棧共享空間pop方法,參數(shù)就只需判斷棧1和棧2 ,空棧返回ERROR,然后相應(yīng)棧頂元素出棧,然后top-1。

2棧共享空間相關(guān)代碼如下:


#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #include <math.h> #include <stdlib.h>#define MAXSIZE 100 #define ERROR 0 #define OK 1 #define TRUE 1 #define FALSE 0 typedef int EleType; typedef int Status; //2棧共享存儲空間 數(shù)據(jù)結(jié)構(gòu) typedef struct SeqDoubleStack {EleType data[MAXSIZE];int top1;int top2;}SeqDoubleStack; /* 彈棧 */ Status pop(SeqDoubleStack* stack,EleType *e,int stackNum) {if (!stack || !e)//空指針{return ERROR;}//棧不為空的情況,根據(jù)棧編號,pop相應(yīng)的棧的元素。//棧1空棧判斷stack->top1!=-1 棧2空棧判斷stack->top2 != MAXSIZEif (stackNum == 1&&stack->top1!=-1){*e = stack->data[stack->top1];stack -> top1--;return OK;}if (stackNum == 2 && stack->top2 != MAXSIZE){*e = stack->data[stack->top2];stack->top2++;return OK;}//棧為空或者編號不對return ERROR; } /* 壓棧操作 */ Status push(SeqDoubleStack* stack, EleType e, int stackNum) {if (!stack)//空指針{return ERROR;}//棧沒有滿的情況,根據(jù)棧編號,push相應(yīng)的棧的元素。//棧未滿的條件都是stack->top1+1 < stack->top2if (stackNum == 1 && stack->top1+1 < stack->top2){stack->top1++;stack->data[stack->top1] = e;return OK;}if (stackNum == 2 && stack->top1 + 1 < stack->top2){stack->top2--;stack->data[stack->top2] = e;return OK;}//棧已滿或者編號不對return ERROR; }/* 展示2個棧的元素 */ void showStack(SeqDoubleStack* stack) {for (int i = 0; i <= stack->top1; i++){printf("%d,",stack->data[i]);}for (int i = stack->top2; i <= MAXSIZE - 1; i++){printf("%d,", stack->data[i]);}printf("\n"); } /* 清空棧元素 */ Status clearSeqDoubleStack(SeqDoubleStack* stack) {if (!stack){return ERROR;}stack->top1 = -1;stack->top2 = MAXSIZE;return OK; } /* 初始化棧 */ Status initSeqDoubleStack(SeqDoubleStack* stack) {if (!stack){return ERROR;}stack->top1 = -1;stack->top2 = MAXSIZE;return OK; } /* 棧元素個數(shù) */ int getLengthSeqDoubleStack(SeqDoubleStack* stack) {if (!stack){return ERROR;}//stack->top1+1;//棧1元素個數(shù)//MAXSIZE - stack->top2;//棧2元素個數(shù)return stack->top1 + 1 + MAXSIZE - stack->top2; } int main(int argc, char *argv[]) {SeqDoubleStack stack;//初始化initSeqDoubleStack(&stack);//壓棧push(&stack, 1, 1);push(&stack, 2, 1);push(&stack, 3, 1);push(&stack, 4, 1);push(&stack, 5, 1);push(&stack, 9, 2);push(&stack, 8, 2);push(&stack, 7, 2);push(&stack, 6, 2);puts("展示元素:");//顯示元素showStack(&stack);printf("元素個數(shù):%d\n", getLengthSeqDoubleStack(&stack));EleType e1;EleType e2;//彈棧pop(&stack, &e1,1);printf("pop:%d,",e1);pop(&stack,&e2,2);printf("pop:%d\n", e2);puts("展示元素:");showStack(&stack);//清空clearSeqDoubleStack(&stack);printf("\n");return 0; }


驗證結(jié)果截圖:


事實上,使用這樣的數(shù)據(jù)結(jié)構(gòu),通常都是2個棧的空間需求有相反關(guān)系時,也就是一個棧增長時,另一個棧在縮短,就像買股票一樣,你買入時,一定有人在做賣出操作。這才2棧共享空間存儲方法才有比較大的意義。這是針對2個相同類型的棧的一種設(shè)計技巧。

總結(jié)

以上是生活随笔為你收集整理的两栈共享存储空间算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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