数据结构之栈的实现
数据集
D={ai|ai∈SElemSet,i=1,2,3……,n,n≥0} ##
操作集
1、栈的构建初始化
Status InitStack(SqStack &S)
{
//初始化栈
//为栈底分配空间
S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
//分配失败返回错误
if(!S.base)
exit(OVERFLOW);
//栈顶和栈底相同
S.top=S.base;
//栈的大小为初始化大小
S.stacksize=STACK_INIT_SIZE;
return OK;
}
2、获取栈顶元素
Status GetTopElem(SqStack S,SElemType &e)
{
//判断栈是否为空栈
if(S.base==S.top)
return ERROR;
//e为TOP位置减1
e=*(S.top-1);
return OK;
}
3、向栈插入元素
Status Push(SqStack &S,SElemType e)
{
//判断栈是否满
if(S.top-S.base>S.stacksize)
{
S.base=(SElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!S.base)
exit(OVERFLOW);
//重新分配地址
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
//栈顶元素加1的位置数据为e
*S.top=e;
S.top=S.top+1;
//*(S.top)++=e;
return OK;
}
4、弹出栈顶元素
Status Pop(SqStack &S,SElemType &e)
{
//判断是否为空栈
if(S.base==S.top)
return ERROR;
e=*--S.top;
//e=*(S.top);
//S.top=S.top-1;
return OK;
}
5、销毁栈
Status DestoryStack(SqStack &S)
{
free(S.base);
S.stacksize=0;
S.top=NULL;
S.base=NULL;
return OK;
}
6、清空栈
Status ClearStack(SqStack &S)
{
S.base=S.top=NULL;
return OK;
}
7、判断栈是否为空栈
Status IsEmpty(SqStack S)
{
if(S.top==S.base)
return 1;
else
return 0;
}
8、获取栈元素个数
int GetLength(SqStack S)
{
return S.top-S.base;
}
主函数实现
int main()
{
SqStack S;
Status i;
int flag=1,j,p=0;
SElemType e;
//初始化栈
i=InitStack(S);
printf("初始状态为%d,长度为%d\n",i,S.stacksize);
system("pause");
//循环压栈
while(flag)
{
printf("请输入压栈元素\n");
scanf("%d",&e);
i=Push(S,e);
p++;
printf("栈底到栈顶元素依次为");
for(j=0;j<p;j++)
{
printf(" %d ",*(S.base+j));
}
printf("\n需要继续输入请按1,停止输入请按0\n");
scanf("%d",&flag);
}
system("pause");
//弹出栈顶元素
i=Pop(S,e);
p--;
printf("弹出元素为%d\n当前元素为",e);
for(j=0;j<p;j++)
{
printf(" %d ",*(S.base+j));
}
i=GetTopElem(S,e);
printf("\n栈顶元素为%d",e);
printf("\n栈的长度为%d",GetLength(S));
system("pause");
return 0;
}
成图
总结
该程序只实现了栈的几个基本功能,可循环压栈,读者可根据需要进行循环出栈操作。
附代码一份(https://download.csdn.net/download/qq_37002607/11449789)