一个数组实现两个栈的具体方法:一个数组实现两个栈(共享栈)但是上述方法的缺陷是数组的大小是恒定的,当数组满的时候就无法进行入栈操作。这篇博客我们将讲一下数组如何扩容?
实现方法:一个数组实现两个栈=====>>下标为0的位置为栈1的栈底,栈2的栈底在下标最大的位置上。栈1向左扩展,栈2向后扩展。若数组已满则增容。
首先定义一个共享栈的结构体:
#define DataType int
typedef struct SharedStack
{
DataType *data;
int capacity;//容量
int top1;
int top2;
}sharedstack;
共享栈的初始化
//共享栈初始化
void InitShared(sharedstack *s)
{
assert(s);
s->capacity = 5;
s->top1 = 0;
s->top2 = s->capacity - 1;
s->data = (DataType *)malloc(s->capacity*sizeof(DataType));
}
入栈:
入栈之前先扩容
void ExpandCapacity(sharedstack *s)
{
DataType *Newnode = NULL;
int newcapacity = 0;
int i = 0;
if (s->top1 <= s->top2)
{
//不用扩容,直接返回
return ;
}
newcapacity = s->capacity * 2;
Newnode = (DataType*)malloc(newcapacity*sizeof(DataType));
if (Newnode == NULL)
{
printf("新空间开辟失败!\n");
return ;
}
//搬移元素
for (i = 0; i < s->top1; i++)
{
Newnode[i] = s->data[i];
}
for (i = s->capacity - 1; i>s->top2; i--)
{
Newnode[i+s->capacity]=s->data[i];
}
s->top2 = s->top2 + s->capacity;
s->capacity = newcapacity;
//释放之前的空间
free(s->data);
s->data = Newnode;
}
//入栈
void PushSharedStack(sharedstack *s, DataType d, int which)
{
assert(s);
ExpandCapacity(s);