用一个数组实现两个堆栈,最大地使用数组的空间,只要有空间就能入栈成功

使两个堆栈分别在数组的两端作为开始:有一个标记,用来区分是哪一个堆栈,Tag。

另外,对于两个堆栈的栈顶,其中一个开始是是0.另外一个初始值就是MaxSize-1了。

所以判断这两个堆栈为空的方法分别为:指向-1和指向MaxSize 这两个是我们自己定义的,就是这样,没有原因

#define MaxSize <存储数据元素最大个数>

struct DStack{

ElementType Data[MaxSize];

int Top1;

int Top2;

}S;

S.Top1 = -1;

S.Top2 = MaxSize;//这两个值表示的是在堆栈为空时的指针情况。


操作:push什么时候就算满了?是两个指针对头的时候,也即Top2-Top1=1;


void Push(struct DStack *PtrS, ElementType item, int Tag)

{if(Ptrs->Top2-PtrS->Top1==1)//堆栈满

{printf("堆栈满");

return;

}

if(Tag==1)??对第一个堆栈进行操作

PtrS->Data[++(PtrS->Top1)]=item;

else

PtrS->Data[--(Ptrs->Top2)]=item;


出栈操作

ElementType Pop(struct DStack *PtrS, int Tag){

if(Tag==1){

if(Ptrs->Top1==-1){

printf("堆栈为空");

return;}

else return PtrS->Data[(PtrS->Top1)--]

}else{

if(PtrS->Top2 == MaxSIze) {

printf("堆栈空");return NULL;}

else return PtrS->Data[(PtrS->Top2)++];

}

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以将数组分成两个部分,一部分作为第一个堆栈存储空间,另一部分作为第二个堆栈存储空间两个堆栈的栈顶分别指向各自的存储空间入栈和出栈操作时分别在各自的存储空间中进行。需要注意的是,两个堆栈存储空间不能相互侵入,即一个堆栈的元素不能放到另一个堆栈存储空间中。 ### 回答2: 在一个数组实现两个堆栈,可以使用数组的两端来分别表示两个堆栈的底部,分别称为stack1和stack2。初始时,可以将stack1底部指针bottom1设置为数组的起始位置,将stack2底部指针bottom2设置为数组的末尾位置。 当需要push一个元素到stack1时,首先将元素插入到bottom1所指向的位置,并将bottom1向右移动一个位置,以防止下一个push时覆盖原来的元素。 当需要push一个元素到stack2时,首先将元素插入到bottom2所指向的位置,并将bottom2向左移动一个位置,以防止下一个push时覆盖原来的元素。 当需要pop一个元素时,可以通过判断bottom1的位置是否超出了数组的末尾位置来确定是从stack1还是stack2中pop出元素。如果bottom1不超出末尾位置,则从bottom1所指向的位置pop出元素,并将bottom1向左移动一个位置。如果bottom1超出了末尾位置,则从bottom2所指向的位置pop出元素,并将bottom2向右移动一个位置。 通过这样的方式,我们可以在一个数组实现两个堆栈。当两个堆栈的元素个数相等并且底部指针相邻时,即bottom1的位置紧挨着bottom2的位置,可以认为两个堆栈已满。在进行push操作时,需要先检查堆栈是否已满,以防止数据溢出。 ### 回答3: 要在一个数组实现两个堆栈的话,可以使用数组的两端作为两个堆栈的起始点。具体的实现方法如下: 首先,定义一个数组两个指针分别指向数组的起始位置和末尾位置。假设数组的大小为n。 堆栈1的起始位置可以设为数组的起始位置,我们将指针1指向该位置。堆栈1的插入操作可以在指针1往后移动一个位置,并将元素插入到该位置,插入后指针1再移动到插入的位置上。 堆栈2的起始位置可以设为数组的末尾位置,我们将指针2指向该位置。堆栈2的插入操作可以在指针2往前移动一个位置,并将元素插入到该位置,插入后指针2再移动到插入的位置上。 堆栈1的删除操作可以直接在指针1所指向的位置上删除元素,并将指针1往前移动一个位置。堆栈2的删除操作可以直接在指针2所指向的位置上删除元素,并将指针2往后移动一个位置。 堆栈1的判空操作可以判断指针1是否等于数组的起始位置。堆栈2的判空操作可以判断指针2是否等于数组的末尾位置。 堆栈1的判满操作可以判断指针1是否与指针2相等。堆栈2的判满操作可以判断指针2是否与指针1相等。 通过以上方法,我们可以在一个数组实现两个堆栈。其中,指针1代表堆栈1的位置,指针2代表堆栈2的位置。堆栈的插入、删除、判空和判满操作也可以在常数时间内完成。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值