顺序栈要求空间复杂度和时间复杂度均为O(n).

2025年03月23日 09:44
有1个网友回答
网友(1):

首先确定顺序表L中的第一个值为x的元素位置i,然后依次检查L.data[i+1]~L.data[L.length-1]中每个元素L.data[j](i+1<=j
[cpp] view plain copy
void delall(Sqlist *l,int x)
{
int i=0,j;
while(ilength && l->data[i]!=x)
i++;
for(j=i+1;jlength;j++)
if(l->data[j]!=x)
{
l->data[i++]=l->data[j];
}
l->length=i;
}
本算法只扫描一次顺序表,即将值为x的元素前移一次,其时间复杂度为O(n)

解法二:
从头开始扫描顺序表L,用k记录下元素值等于x的元素个数,对于不等于x的元素,前移k个位置,这种算法复杂度为O(n),其中n为顺序表的长度,算法如下:

[cpp] view plain copy
void delall(Sqlist *l,int x)
{
int i=0,j=0;
while(ilength)
{
if(l->data[i]==x)
j++;//j记录被删记录的个数
else
l->data[i-j]=l->data[i];//前移j个位置
i++;
}
l->length-=j;
}