【浙大数据结构学习笔记】2.2.2-例题:实现用一个数组实现两个堆栈,要求最大的利用数组空间

题目: 请用一个数组实现两个堆栈,要求最大的利用数组空间,使数组只要有空间入栈操作就可以成功。

思路:

  1. 中间为栈底,两头为栈顶
    在这里插入图片描述

  2. 两头为栈底,栈顶向内扩张
    在这里插入图片描述

很明显,思路2符合要求。 思路1 虽然实现了用一个数组实现两个堆栈,但是当stack1满,而stack2未满时,再无法向stack1插入元素,同时因stack2的剩余空间无法得到使用而造成了空间浪费。思路2不存在stack1或者stack2满的限制,直到两个堆栈占满整个数组空间才无法继续压入元素。因此,思路2 不仅实现了用一个数组实现两个堆栈,而且实现了只要有空间入栈操作就可以成功,最大地利用了数组空间。

代码实现:

#include "stdio.h"
#include "stdlib.h"
#define MaxSize 10

struct DStack{
	int Data[MaxSize];
	int top1;
	int top2;
};

int Push(struct DStack *PtrD,int X,int Tag){
	if(PtrD->top2-PtrD->top1==1){
		printf("堆栈满!\n");
		return false; 
	}else{
		if(Tag==1){
			PtrD->Data[++(PtrD->top1)]=X;
		}else{
			PtrD->Data[--(PtrD->top2)]=X;
		}
		return true;
	}
	
}
int Pop(struct DStack *PtrD,int Tag){
	if(Tag==1){
		if(PtrD->top1==-1){
			printf("堆栈1空!\n");
			return NULL;
		}else{
			return (PtrD->Data[(PtrD->top1)--]);
		}
	}else{
		if(PtrD->top2==MaxSize){
			printf("堆栈2空!\n");
			return NULL;
		}else{
			return (PtrD->Data[(PtrD->top2)++]);
		}
	}
}
int main(){
	struct DStack S;
	S.top1=-1;
	S.top2=MaxSize;
	
	Pop(&S,1);
	Pop(&S,2);
	printf("%d\n",Push(&S,1,1));
	printf("%d\n",Push(&S,2,1));
	printf("%d\n",Push(&S,1,2));
	printf("%d\n",Push(&S,2,2));
	printf("%d\n",Pop(&S,1));
	printf("%d\n",Pop(&S,1));
	printf("%d\n",Pop(&S,2));
	printf("%d\n",Pop(&S,2));
	return 0;
}

运行结果:
加粗样式
**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值