eg.要求一个数组实现两个堆栈,要求最大限度地利用数组空间,使数组只要有空间入栈就可以成功
【分析】 一种比较聪明的方法是使这两个栈分别从数组的两头开始 向中间生长;当两个栈的栈顶指针相遇时,表示两个栈都满了。
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 100
typedef int ElementType;
typedef struct Dstack {
ElementType Data[MaxSize];
int Top1; //堆栈1的栈顶指针
int Top2; //堆栈2的栈顶指针
}S;
Dstack S;
S.Top1 = -1;
S.Top2 = MaxSize;
//入栈
void Push(struct Dstack *PtrS, ElementType item, int Tag) { //Tag用来标记两个堆栈1和2
if (PtrS->Top2 - PtrS->Top1 == 1) { //两个挨在一起了堆栈就满了
printf("堆栈满\n");
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("堆栈1空\n");
return NULL;
}
else
return PtrS->Data[(PtrS->Top1)--];
}
else {
if (PtrS->Top2 == MaxSize) {
printf("堆栈2空\n");
return NULL;
}
else
return PtrS->Data[(PtrS->Top2)++];
}
}