Re:从零开始的算法学习【9】栈

栈是一种重要的线性结构,是线性表(顺序表、链表)的一种具体形式——栈必须通过链表或者顺序表来实现。


一.栈的定义

    定义:栈是一个后进先出的线性表,要求只在表尾进行数据的删除和插入等操作。


线性表有两种储存形式——顺序表储存和链表储存。一般的栈都是用顺序表实现的。

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

二.创建一个栈

①在内存中开辟一段连续的空间,用作栈的物理存储空间。

②将栈顶、栈底地址赋值给sqStack类型变量的top和base域,并设置stacksize值,以便通过这个变量对栈进行各种操作

initStack (sqStack *s)
{
	//在内存中开辟一段连续空间作为栈空间,首地址赋值给s->base 
	s->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));
	if(!s->base)	exit(0);	//分配内存失败
	s->top = s->base;	//最开始,栈顶就是栈底,此时为空栈
	s->stacksize = STACK_INIT_SIZE;		//最大容量为STACK_INIT_SIZE 
}

三.入栈操作

入栈操作(压栈操作),就是向栈中存放数据。入栈操作要在栈顶进行,每向栈中压入一个数据,top指针就增加1,直到栈满为止。

Push (sqStack *s , ElemType e){
	if(s->top - s->base >= s->stacksize)	//判断栈是否已满 
	{	//如果栈满,通过realloc()函数追加空间 
		s->base = (ElemType *)realloc(s->base , (s->stacksize + STACKINCREMENT)*sizeof(ElemType));
		if(!s->base)	exit(0);	//分配内存失败
		s->top = s->base + s->stacksize;
		s->stacksize = s->stacksize + STACKINCREMENT;		//设置栈的最大容量 
	}
	*(s->top) = e;		//放入数据 
	s->top ++ ;			//top指针自增1 
}

四.出栈操作

在栈顶取出数据,栈顶指针随之下移。每当从栈内弹出一个数据,栈的当前容量就减少1.可以重复出栈,直到栈变为空栈。

Pop (sqStack *s , ElemType *e)
{
	if(s->top == s->base)	return;		//栈为空,程序返回 
	*e = *--(s->top);		//将栈顶元素取出,同时top指针自减1 
 } 

出栈操作是先将指针s->top减1,再取出指针指向的内容,赋值给e

五.栈的其他操作

1.清空一个栈

就是将栈中的元素全部作废,而栈的物理空间并不一定发生改变。只需将s->top的内容赋值为s->base即可,这样s->base等于s->top,也就表明这个栈是空的了。

ClearStack(sqStack *s)
{
	s->top = s->base;	//将栈底指针赋值给栈顶指针,表明栈已变空 
 }

2.销毁一个栈

与清空栈不同,销毁栈是要释放掉该栈所占据的物理内存空间。

DestroyStack(sqStack *s)
{
	free(s->base);		//释放掉内存空间 
	s->base = s->top = NULL;	//栈底栈顶指针置NULL 
	s->stacksize = 0;	//设置栈的最大容量为0 
 } 

3.计算栈的当前容量

计算栈中元素个数,只需要返回s.top - s.base即可。

int StackLen(sqStack s)
{
	return (s.top - s.base);
 }

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭