数据结构顺序栈-进阶(C语言版)


GITHUB地址为https://github.com/fz861062923/Data-Structure/tree/master/Squential%20Stack

栈的顺序结构表示

typedef struct
{
ElemType *base;
ElemType  *top;
int  stacksize;
}SqStack;

构建一个空栈

Status InitStack(SqStack &S)
{
S.base = (ElemType*)malloc(STACK_INIT_SIZE*sizeof(ElemType));
if (!S.base)
exit(OVERFLOW);//存储分配失败
S.top = S.base;
S.stacksize = STACK_INIT_SIZE;
return OK;
}

销毁栈

Status DestroyStack(SqStack &S)
{
S.top = NULL; 
S.stacksize = 0; 
free(S.base); 
return OK;
}

清空栈

Status ClearStack(SqStack &S)
{
S.top = S.base;
return OK;
}

判断栈是否为空

Status StackEmpty(SqStack S)
{
if (S.top == S.base)
return ERROR;
else
return TRUE;
}

求栈的长度

Status StackLength(SqStack S)
{
if (S.top == S.base)
return FALSE;
else
return (S.top - S.base);//也可以直接返回S.top - S.base
}

求栈顶元素

Status GetTop(SqStack S, ElemType &e)
{
if (S.top == S.base)
return FALSE;
else
e = *(S.top - 1);
return e;
}

栈顶插入元素

Status Push(SqStack &S, ElemType &e)
{
if (S.top - S.base >= STACK_INIT_SIZE)
{
S.base = (ElemType *)realloc(S.base, (S.stacksize + STACKINCREMENT) * sizeof(ElemType));
if (!S.base)
{
return false;
}
S.top = S.base + STACK_INIT_SIZE;//栈底地址可能改变,重新定位栈顶元素
S.stacksize = S.stacksize + STACKINCREMENT;
}
*S.top = e;
S.top++;//注意这里没有合并和我上篇文章不一样
return OK;
}

删除栈顶元素

Status Pop(SqStack &S, ElemType &e)
{
if (S.top == S.base)
return ERROR;
else
{
S.top--;//注意上篇文章合并了,此处分了两步走
e = *S.top;//说明:此处容易使人迷惑,实际上此元素并没真正删除,仍在S.top中,但是如果插入元素,就会被更新,就像是删除了一样
return e;
}
}

遍历栈

Status StackTraverse(SqStack S)
{
if (S.base == NULL)
return ERROR;
if (S.top == S.base)
printf("栈中没有元素……\n");
ElemType *p;
p = S.top;
while (p > S.base)
{
p--;
printf("%d ",*p);
}

return OK;
}

主函数检验九种操作

int main()
{
SqStack S;
printf("构造一个空栈……\n");
InitStack(S);
int i,n ;
printf("输入栈的长度:\n");
scanf("%d",&n);
for (i = 1; i <= n; i++)
{
printf("输入栈的第%d个元素\n",i);
++S.top;
scanf("%d",S.top-1);
}
printf("……本栈是空栈吗?……\n");
if (StackEmpty(S) == 1)
 printf("不是\n");
else
 printf("是的\n");
printf("……求出栈的长度……\n");
int m;
m=StackLength(S);
printf("栈的长度是:\n");
printf("%d\n",m);
printf("遍历输出栈中的所有元素:\n");
StackTraverse(S);
printf("\n");
printf("……输出栈顶元素……\n");
int e;
e=GetTop(S, e);
printf("栈顶元素是:\n");
printf("%d\n",e);
printf("……栈顶插入元素……\n");
printf("请输入要插入的元素的数值:\n");
scanf("%d",&e);
Push(S,e);
printf("现在栈中的元素是:\n");
StackTraverse(S);
printf("\n");
printf("……栈顶删除元素……\n");
e=Pop(S,e);
printf("被删除的元素是:\n");
scanf("%d",&e);
printf("现在栈中的元素是:\n");
StackTraverse(S);
printf("\n");
printf("……清空栈……\n");
ClearStack(S);
printf("现在栈中的元素是:\n");
StackTraverse(S);
printf("……销毁栈……\n");
if(DestroyStack(S)==1)
printf("销毁栈成功\n");
else
printf("销毁栈失败\n");
return 0;
}
发布了44 篇原创文章 · 获赞 82 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/weixin_41503009/article/details/86669685