两栈共享空间
?兩個相同類型的棧,可能第一個棧已經滿了,但是第二個棧還是空的,將兩個相同類型的棧合并在一起,可以節(jié)省一部分空間。
數組有兩個端點,分別為兩個棧的棧底,一個棧的棧底的位置為數組為0的地方,另一個棧的棧底為數組下標為SIZE-1的位置,SIZE為數組的長度。兩個棧如果增加元素,就是兩端點向中間延伸。
只要兩個棧頂指針不碰面,元素就可以一直進棧。
?
?
頭文件
#pragma once //順序棧 #define MAXSIZE 10 typedef struct DoubleStack {int *elem;//數據int top1;//左邊棧的棧頂指針int top2;//右邊棧的棧頂指針 }DoubleStack,* PDoubleStack; //初始化 void InitDoubleStack(PDoubleStack ps); //入棧 bool Push(PDoubleStack ps,int val,int num); //出棧 bool Pop(PDoubleStack ps,int *rtval,int num); //清空 bool Clear(PDoubleStack ps); //銷毀 void Destroy(PDoubleStack ps);cpp文件
#include<stdio.h> #include<assert.h> #include<stdlib.h> #include"DoubleStack.h"void InitDoubleStack(PDoubleStack ps) {ps->elem = (int *) malloc (MAXSIZE *sizeof(int));ps->top1= 0;ps->top2 =MAXSIZE-1; }static bool IsFull(PDoubleStack ps) {return ps->top1+1 == ps->top2; }bool IsEmpty(PDoubleStack ps) {if(!(ps->top1 == 0 && ps->top2 == 0 )){return false;}return true; }bool Push(PDoubleStack ps,int val,int num) {assert(ps != NULL);if(ps == NULL){return NULL;}if(IsFull(ps)){return false;}if(num == 1){ps->elem[ps->top1] = val;ps->top1++;}else if(num == 2){ps->elem[ps->top2] = val;ps->top2--;}return true; } //num表示的是要進哪個棧 bool Pop(PDoubleStack ps,int *rtval,int num) {assert(ps != NULL && rtval != NULL);if(ps == NULL){return NULL;}if(!(IsEmpty(ps))){if(num == 1){*rtval = ps->elem[--ps->top1];}else if(num == 2){*rtval = ps->elem[++ps->top2];}return true;}return false; }bool Clear(PDoubleStack ps) {ps->top1 = 0;ps->top2 = MAXSIZE -1;return true; }void Destroy(PDoubleStack ps) {free(ps->elem);ps -> top1 = 0;ps -> top2 = 0; }主函數
#include<stdlib.h> #include"DoubleStack.h"int main() {DoubleStack sta;InitDoubleStack(&sta);for(int i = 0;i<7;i++){Push(&sta,i,1);}for(int i = 0;i<2;i++){Push(&sta,i+10,2);}int rtval = -1;Pop(&sta,&rtval,1);printf("%d\n",rtval);for(int i = 0;i<10;i++){printf("%d\n",sta.elem[i]);}Destroy(&sta);return 0; }?
總結
- 上一篇: python获取shell输出及返回码_
- 下一篇: string修饰的梦修改吗_知识点!!!