生活随笔
收集整理的這篇文章主要介紹了
两栈共享存储空间算法
小編覺得挺不錯的,現(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)容還不錯,歡迎將生活随笔推薦給好友。