C语言栈代码

#include<stdio.h>
#include<malloc.h>
#include<process.h>
#define STACK_INIT_SIZE 10
#define STACKINCREMENT 2

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

int InitStack(SqStack *S){
	(*S).base = (int *)malloc(STACK_INIT_SIZE*sizeof(int));
	if(!(*S).base)
		exit(0);
	(*S).top = (*S).base;
	(*S).stacksize = STACK_INIT_SIZE;
	return 1;
}

int Push(SqStack *S,int e){
	if((*S).top-(*S).base>=(*S).stacksize){
		(*S).base = (int *)realloc((*S).base,((*S).stacksize+STACKINCREMENT)*sizeof(int));
		if(!(*S).base)
			exit(0);
		(*S).top = (*S).base +(*S).stacksize;
		(*S).stacksize+=STACKINCREMENT;
	}
	*((*S).top) ++= e;
	return 1;
}

int DestroyStack(SqStack *S){
	free((*S).base);
	(*S).base = NULL;
	(*S).top = NULL;
	(*S).stacksize = 0;
	return 1;
}

int ClearStack(SqStack *S){
	(*S).top = (*S).base;
	return 1;
}

int StackEmpty(SqStack S){
	if(S.top == S.base)
		return 1;
		else 
			return 0;
}

int StackLength(SqStack S){
	return S.top-S.base;
}

int GetTop(SqStack S,int *e){
	if(S.top>S.base){
		*e = *(S.top-1);
		return 1;
	}
		else
			return 0;
}

int Pop(SqStack *S,int *e){
	if((*S).top == (*S).base)
		return 0;
	*e = *--(*S).top;
	return 1;
}

int StackTraverse(SqStack S,int(*visit)(int)){
	while(S.top>S.base)
		visit(*S.base++);
	printf("\n");
	return 1;
}

int visit(int c){
	printf("%d ",c);
	return 1;
}

void main(){
	int j;
	SqStack s;
	int e;
	if(InitStack(&s)==1)
		for(j=1;j<12;j++)
			Push(&s,j);
		printf("the stack number order in ");
			StackTraverse(s,visit);
			//printf("%d ",(s.top));
		Pop(&s,&e);
		printf("stack empty?  : %d(1:yes.  0 :no),%d\n",StackEmpty(s),e);
		GetTop(s,&e);
		printf("the pop number e = %d: the length:%d \n",e,StackLength(s));
		ClearStack(&s);
		printf("after clear ,empty?:%d\n",StackEmpty(s));
		DestroyStack(&s);
		printf("after destroy :s.top = %d ,s.base = %d,s.stacksize=%d\n",s.top,s.base,s.stacksize);
}







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值