简单的C语言栈的实现代码

#include <STDIO.H>
#include <MALLOC.H>
#include <assert.h>
#include <stdlib.h>


typedef int ElemType;
const int stackMaxSize = 50;
struct Stack{
ElemType *base;
ElemType *top;
int stacksize;
};


void initStack(Stack *S)
{
assert(S != NULL);
S->base = (ElemType *)malloc(sizeof(ElemType)*stackMaxSize);
if (NULL == S->base)
{
exit(0);
}
S->top = S->base;
S->stacksize = 0;
}


void DestoryStack(Stack *S)
{
assert(S != NULL);
if (S->base)
{
free(S->base);
}
S->base = S->top = NULL;
S->stacksize = 0;
}


void ClearStack(Stack *S)
{
assert(S != NULL);
if (S->base)
{
S->top = S->base;
S->stacksize = 0;
}
}


int isEmpty(Stack *S)
{
assert(S != NULL);
return !S->stacksize;
}


int StackLength(Stack *S)
{
assert(S != NULL);
return S->stacksize;
}


void getTop(Stack *S,ElemType *e)
{
assert(S != NULL);
assert (!isEmpty(S));
*e = S->base[S->stacksize-1];
}


void push(Stack *S,ElemType e)
{
assert(S != NULL);
assert(S->stacksize != stackMaxSize);
*(S->top) = e;
S->stacksize++;
S->top = &S->base[S->stacksize];
}


void pop(Stack *S,ElemType *e)
{
assert(S != NULL);
assert (!isEmpty(S));
*e = S->base[S->stacksize-1];
S->stacksize--;
S->top = &S->base[S->stacksize];
}


//遍历栈
void stackTraverse(Stack *S,void (*visit)(ElemType e))
{
assert(S != NULL);
assert (!isEmpty(S));


int i=0;
while (i<S->stacksize)
{
visit(S->base[i]);
++i;
}
}


void visit(ElemType e)
{
printf("%d ",e);
}


int main(void)
{
Stack S;
ElemType arr[] = {1,2,3,4,5,6,7,8};
ElemType e;
initStack(&S);
int arrLength = sizeof(arr)/sizeof(arr[0]);
int i=0;
while(i< arrLength)
{
push(&S,arr[i++]);
}
printf("栈的大小:%d\n",StackLength(&S));
printf("从栈底访问所有元素:");
stackTraverse(&S,&visit);
printf("\n出栈:");
while(!isEmpty(&S))
{
pop(&S,&e);
visit(e);
}
printf("\n23 压栈");
push(&S,23);
getTop(&S,&e);
printf("\n获取栈顶元素:%d",e);
printf("\n清空栈...\n");
ClearStack(&S);
printf("栈的大小:%d\n",StackLength(&S));
printf("\n销毁栈...\n");
DestoryStack(&S);
return 0;

}


结果:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值