栈--链式存储

代码内容来自《大话数据结构》

#include<stdio.h>
#include<stdlib.h>

#define OK		1
#define ERROR	0
#define TRUE	1
#define FALSE	0

typedef int Status;
typedef int SElemType;

struct StackNode{
	SElemType data;
	struct StackNode * next;
};
typedef struct StackNode * LinkStackPtr;

struct LinkStack{
	LinkStackPtr top;
	int count;
};

Status visit(SElemType c){
	printf("%d ",c);
	return OK;
}

Status InitStack(LinkStack *S){
	S->top = (LinkStackPtr)malloc(sizeof(struct StackNode));
	if( ! S->top ){
		return ERROR;
	}
	S->top = NULL;
	S->count = 0;
	return OK;
}

Status ClearStack(LinkStack *S){
	LinkStackPtr p,q;
	p = S->top;
	while(p){
		q = p;
		p = p->next;
		free(q);
	}
	S->count = 0;
	return OK;
}

Status StackEmpty(LinkStack S){
	if(S.count){
		return FALSE;
	}
	return TRUE;
}

int StackLength(LinkStack S){
	return S.count;
}

Status GetTop(LinkStack S,SElemType *e){
	if(S.top){
		*e = (S.top)->data;
		return OK;
	}
	return ERROR;
}

Status Push(LinkStack *S,SElemType e){
	LinkStackPtr p = (LinkStackPtr)malloc(sizeof(struct StackNode));
	p->data = e;
	p->next = S->top;
	S->top = p;
	S->count ++;
	return OK;
}

Status Pop(LinkStack *S,SElemType *e){
	if( ! S->top){
		return ERROR;
	}
	*e = S->top->data;
	LinkStackPtr p = S->top;
	S->top = S->top->next;
	S->count--;
	free(p);
	return OK;
}

Status StackTraverse(LinkStack S){
	LinkStackPtr p = S.top;
	while(p){
		visit(p->data);
		p = p->next;
	}	
	printf("\n");
	return OK;
}

int main(){
	int j;
	Status i;
	SElemType e;
	LinkStack S;
	i = InitStack(&S);
	if( i){
		printf("初始化成功\n");
	} else {
		printf("初始化失败\n");
	}
	printf("栈是否为空 %d\n",StackEmpty(S));
	for(j=1;j<=10;j++){
		Push(&S,j*2);
	}
	StackTraverse(S);

	Pop(&S,&e);
	printf("弹出的元素为%d\n",e);
	StackTraverse(S);

	i = GetTop(S,&e);
	printf("此时的栈顶元素是%d \n",e);

	printf("栈长度为%d\n",StackLength(S));

	printf("栈是否为空 %d\n",StackEmpty(S));

	ClearStack(&S);
	printf("栈是否为空 %d\n",StackEmpty(S));
}

  

posted @ 2018-04-15 14:07  寻觅beyond  阅读(253)  评论(0)    收藏  举报
返回顶部