栈的基本操作

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

/*栈(Stack)是只在表尾进行删除和插入的工作*/
/*栈,其实就是一个特殊的线性表,但是它在操作上有一些特殊的要求限制*/
/*栈的元素必须  "先进后出"  */
/*栈的操作只在线性表的表尾进行*/
/*对于栈来说,表尾称为栈顶(top),表头成为栈底(bottom)*/

//栈的插入操作(push),叫做进栈,也称为压线,入栈,类似于子弹放入弹夹的动作
//栈的删除操作(pop),叫做出栈,也称为弹栈。如同弹夹中子弹出夹

#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10

typedef int ElemType;
typedef struct
{
	ElemType *base;//栈底
	ElemType *top;//栈顶
	int stackSize; //栈的当前可使用的最大容量
} sqStack;

void initStack(sqStack *s)
{
	s->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));
	if(!s->base)
	{
		exit(0);
	}
	else
	{
		s->top = s->base;//最开始,栈顶就是栈底
		s->stackSize = STACK_INIT_SIZE;
	}
}

/*入栈操作(压栈操作)*/
void Push(sqStack *s, ElemType e)
{
	//如果栈满,追加空间
	if(s->top - s->base >= s->stackSize)
	{
		s->base = (ElemType *)realloc(s->base, (s->stackSize + STACK_INIT_SIZE) * sizeof(ElemType));
		if(!s->base)
		{
			exit(0);
		}
		else
		{
			s->top = s->base + s->stackSize;//设置栈顶
			s->stackSize = s->stackSize + STACKINCREMENT; //
		}
	}
	*(s->top) = e;
	s->top++;
}

/*出栈操作*/
void Pop(sqStack *s, ElemType *e)
{
	if(s -> top == s->base)
	{
		return ;
	}
	else
	{
		*e = *--(s->top);
	}
}
/*清空一个栈*/
//只需把s->top的内容赋值给s->base 即可
void ClearStack(sqStack *s)
{
	s->top  =  s->base;
}
/*销毁一个栈*/
//释放该栈所占据的物理内存空间
void DestoryStack(sqStack *s)
{
	int i;
	int len;
	ElemType *p;
	len = s->stackSize;
	for(i = 0; i < len; i++)
	{
		s->base = p;
		free(p);
		s->base++;
	}
	s->base = s->top = NULL;
	s->stackSize = 0;
}
/*计算栈的当前容量*/
int StackLen(sqStack s)
{
	return (s.top - s.base);
}
int main()
{
	sqStack S;
	initStack(&S);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值