今天我们一起来看一种新的数据结构栈,其实这一种结构我们在之前就已经使用过,只是今天我们来强调以下几点:
1、栈是一种数据后进先出的结构 ,通过入栈1 2 3 4我们可以得到多种结果
2、我们选用顺序表来实现栈结构,这里我们堆顺序表可能造成的空间浪费可以忽略不记
下面是栈的结构体的书写:本质上还是顺序表,只是这里我们使用top来指向栈顶空间
下面是实现栈空间的核心函数:主要涉及插入和删除,插入我们只能从尾部插入,删除也是尾部删除,因为是后进先出。这里我们多出一个返回栈顶函数。 对于栈,我们不能写遍历函数,因为我们访问栈的元素只能从尾部访问,访问后要将它删除,也就是从栈的顶部出去,其中STEmpty函数是用来判断栈是否为空。
对于初始化函数:我们可以将top设置为0或-1,区别在于指向元素的位置不一样
对于销毁函数:与顺序表一致
对于插入函数:与顺序表一致
对于判断函数是否为空函数:pst->top为0就返回真
对于返回栈顶元素:这里我们要断言,要求pst和顺序表不为空
最后我们再次强调我们不能写遍历打印函数,因为这样写栈就失去了意义
希望本期内容对大家有所帮助!!!
下面是完整的代码
void InitST(ST* pst)
{
assert(pst);
pst->data = NULL;
pst->capcity = 0;
pst->top = 0;
}
void STPush(ST* pst, Datatype x)
{
assert(pst);
Datatype NewCapcity = 0 == pst->capcity ? 4 : pst->capcity * 2;
ST* ptr = (ST*)realloc(pst->data, NewCapcity * sizeof(Datatype));
if (ptr == NULL)
{
perror("realloc_fail");
return;
}
else
{
pst->data = ptr;
}
pst->capcity = NewCapcity;
pst->data[pst->top] = x;
pst->top++;
}
bool STEmpty(ST* pst)
{
assert(pst);
return pst->top == 0;
}
void STPop(ST* pst)
{
assert(pst);
assert(!STEmpty(pst));//目的是让top不为空,为空就会报错
pst->top--;
}
Datatype STTop(ST* pst)
{
assert(pst);
assert(!STEmpty(pst));
return pst->data[pst->top - 1];
}
void DestroyST(ST* pst)
{
free(pst->data);
pst->data = NULL;
pst->capcity = 0;
pst->top = 0;
}
int STsize(ST* pst)
{
assert(pst);
return pst->top;
}