您的位置:首页 > 编程语言 > C语言/C++

C语言栈结构实现

2015-11-14 14:34 429 查看
由于各种各样的原因,时隔半年,再也没碰过数据结构,现在一方面为明年考研做准备另一方面也是科研需要提升自己的编程能能力,现在重新继续数据结构的学习,选择的教材是严蔚敏老师的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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c 考研 数据结构