顺序栈----C语言

栈的特点嘛大家都知道,先进后出,类似一个桶。。。

这里我们对栈的操作有

1:初始化栈   2:入栈   3:出栈   4:获取栈顶元素  5:展示栈中元素  6:清理栈中元素  7:销毁栈(还有一些static的函数,为了辅助这些操作实现的,我就不列出来了,看代码好吧^ ^)

/*************************************************************************
    > File Name: stack.h
    > Created Time: Thu 19 Jul 2018 10:25:55 AM CST
 ************************************************************************/

#include<stdio.h>
#include<assert.h>
#include<string.h>
#include<unistd.h>
#include<stdlib.h>

#define MaxLength 5
typedef int ElemType;
typedef int Boolean;
#define TRUE 1;
#define FALSE 0;

typedef struct 
{
	ElemType *base;    //栈底指针
	ElemType *top;     //栈顶指针
	int stacksize;     //栈大小
}Sqstack;

void InitStack(Sqstack *s);
void PushStack(Sqstack *s,ElemType val);
void GetTop(Sqstack *s);
void PopStack(Sqstack *s);
void ShowStack(Sqstack *s);
void CleanStack(Sqstack *s);
void DestroyStack(Sqstack *s);


/*************************************************************************
    > File Name: stack.c
    > Created Time: Thu 19 Jul 2018 10:20:24 AM CST
 ************************************************************************/

#include"stack.h"


void InitStack(Sqstack *s)   //初始化一个空的顺序栈
{
	assert(s!=NULL);
	s->base=(ElemType *)malloc(MaxLength*sizeof(ElemType));
	if(!s->base)
	{
		printf("malloc errer\n");
		exit(0);
	}
	s->top=s->base;
	s->stacksize=MaxLength;
}
static void Add_volume(Sqstack *s)   //增加栈的容量
{
	s->base=(ElemType *)realloc(s->base,s->stacksize*sizeof(ElemType));
	if(!s->base)
	{
		printf("add error\n");
		return;
	}
	s->top=s->base+s->stacksize;   //更新top的位置,有可能改变了
	s->stacksize*=2;
}
static Boolean Is_Full(Sqstack *s)  //判栈满
{
	if(s->top-s->base>=s->stacksize)
	{
		return TRUE;
	}
	return FALSE;
}
static Boolean Is_Empty(Sqstack *s) //判栈空
{
	if(s->top==s->base)
	{
		return TRUE;
	}
	return FALSE;
}
void PushStack(Sqstack *s,ElemType val) //元素入栈
{
	assert(s!=NULL);
	if(Is_Full(s))
	{
		Add_volume(s);
	}
	*(s->top)=val;
	s->top++;
}
void GetTop(Sqstack *s)  //获取栈顶元素
{
	assert(s!=NULL);
	if(Is_Empty(s))
	{
		printf("no top elemtype\n");
		return; 
	}
	printf("栈顶元素是:%d\n",*(s->top-1));
}
void PopStack(Sqstack *s)  //出栈
{
	assert(s!=NULL);
	if(Is_Empty(s))
	{
		return;
	}
	s->top--;
}
void ShowStack(Sqstack *s)
{
	if(Is_Empty(s))
	{
		printf("the stack is empty\n");
		return;
	}
	ElemType *p=s->base;
	printf("从栈底开始到栈顶元素依次是:");
	while(p!=s->top)
	{
		printf("%d  ",*p);
		p++;
	}
	printf("\n");
}
void CleanStack(Sqstack *s)  //清空栈
{
	assert(s!=NULL);
	s->top=s->base;
}

void DestroyStack(Sqstack *s) //销毁栈
{
	assert(s!=NULL);
	free(s->base);
	s->base=NULL;
	s->top=NULL;
	s->stacksize=0;
}

/*************************************************************************
    > File Name: main.c
    > Created Time: Thu 19 Jul 2018 11:55:15 AM CST
 ************************************************************************/

#include"stack.h"

int main()
{
	Sqstack s;
	InitStack(&s);
	int i=1;
	for(;i<=9;i++)
	{
		PushStack(&s,i*2);
	}
	ShowStack(&s);
	GetTop(&s);
	PopStack(&s);
	ShowStack(&s);
	CleanStack(&s);
	ShowStack(&s);
	DestroyStack(&s);
    return 0;
}

 

猜你喜欢

转载自blog.csdn.net/Eunice_fan1207/article/details/81182877