C语言栈结构实现

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huxiaotong_exp/article/details/49835639
由于各种各样的原因,时隔半年,再也没碰过数据结构,现在一方面为明年考研做准备另一方面也是科研需要提升自己的编程能能力,现在重新继续数据结构的学习,选择的教材是严蔚敏老师的C语言数据结构,I will be a sticker!

栈结构实现
stack.h
#ifndef __STACK_H
#define __STACK_H

#define STACK_INIT_SIZE 100 //栈初始化大小 
#define STACK_INCREAMENT 10//栈增加大小 
#define OVERFLOW -1 
#define OK 1
#define ERROR 0 
#define TRUE 1
#define FALSE 0

typedef unsigned char u8;

typedef struct{
	int id;
}SElemType;

typedef struct{
	SElemType *base;//栈底指针 
	SElemType *top;//栈顶指针 
	int stacksize;//指示当前可用最大容量 
}SqStack;

u8 InitStack(SqStack *S);
u8 DestoryStack(SqStack *S);
u8 ClearStack(SqStack *S);
u8 StackEmpty(SqStack *S);
int StackLenth(SqStack *S);
u8 GetTop(SqStack *S,SElemType *e);
u8 Push(SqStack *S,SElemType *e);
u8 Pop(SqStack *S,SElemType *e);
u8 StackTraverse(SqStack *S,u8(*visit)()); 
#endif 
stack.c
#include "stack.h"
 #include "stdlib.h"
 //顺序栈结构

//初始化栈  
u8 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;
}

//销毁栈 
u8 DestoryStack(SqStack *S)
{
	if(!S->base)
		return ERROR;
	S->top = NULL;
	S->stacksize = 0; 
	free(S->base); 
	return OK;
 }
 
//清空栈 
u8 ClearStack(SqStack *S)
{
	if(!S->base)
		return ERROR; 
	S->top = S->base;
	return OK;
}

u8 StackEmpty(SqStack *S)
{
	if(!S->base)
		return ERROR;
	if(S->base==S->top)
		return TRUE;
	else
		return FALSE;
}
int StackLenth(SqStack *S)
{
	int len=0;
	if(!S->base)
		return FALSE;
	SElemType *p = S->base;
	while(p!=S->top)
	{
		len++;p++; 
	}
	return len	;
}

u8 GetTop(SqStack *S,SElemType *e)
{
	if(!S->base||(S->top == S->base))
		return ERROR; 
	*e = *(S->top-1);
	return OK;
}
//入栈 
u8 Push(SqStack *S,SElemType *e)
{
	if(S->top-S->base>=S->stacksize)//栈内存不足
	{
		S->base = (SElemType*)realloc(S->base,(S->stacksize+STACK_INCREAMENT)*sizeof(SElemType));
		if(!S->base) exit(OVERFLOW);//内存分配失败 
		S->top = S->base + S->stacksize;
		S->stacksize += STACK_INCREAMENT;
	}	
	
	*S->top++ = *e;
	return OK;
}

//出栈 
u8 Pop(SqStack *S,SElemType *e)
{
	if(S->top==S->base)//栈空 
		return ERROR;
	*e = *--S->top;
	return OK;
} 
u8 StackTraverse(SqStack *S,u8(*visit)())
{
	return OK;
}
main.c
#include "stack.h"
#include "stdio.h"

int  main()
{
	u8 i;
	SqStack S;
	int num = 10;
	SElemType es[num];
	SElemType e; 
	InitStack(&S);
	if(StackEmpty(&S))
		printf("栈为空\n");
	printf("-----------------------------\n");
	for(i = 0;i<num;i++)
	{
		es[i].id = i;
	}
	for(i = 0;i<num;i++)
	{
		printf("%d\n",es[i].id);
	}
	printf("-----------------------------\n");
	for(i = 0;i<num;i++)
	{
		Push(&S,&es[i]);
		GetTop(&S,&e);
		printf("当前入栈元素ID:%d\n",e.id);
	}
	printf("栈长度:%d\n", StackLenth(&S));
	printf("-----------------------------\n");
	printf("出栈:\n");
	 for(i = 0;i<num;i++)
	{
		Pop(&S,&e);
		printf("当前出栈元素ID:%d\n",e.id);
	}
	ClearStack(&S);
	if(StackEmpty(&S))
		printf("已清空栈\n");
	if(DestoryStack(&S)) 
	{
		printf("已经销毁栈");
	}	
	return 0;
 } 



猜你喜欢

转载自blog.csdn.net/huxiaotong_exp/article/details/49835639