栈(stack)是限定仅在表尾进行插入或删除操作的线性表。栈实现了一种先进后出(last-in, fast-out, 缩写为LIFO)的策略。形象的比喻:生活中的放盘子,最先放的盘子在最下面,最后放的盘子在上面。

栈的实现

#define STACK_INIT_SIZE    100u
#define STACKINCREMENT     10u

定义结构体SElemType

typedef struct {
	int val;
}SElemType;

定义结构体SqStack.

typedef struct {
      SElemType *base;
      SElemType *top;
     int  stacksize;
}SqStack;

  • base指向栈底。
  • top指向栈顶。
  • stacksize指示栈的当前可使用的最大容量。

当base值为NULL,表明栈结构不存在。当base=top,表明栈为空。

构造空栈

void InitStack(SqStack *S)
{
	S->base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));
	if (S->base == NULL)
	{
		exit(0);
	}
	S->top = S->base;
	S->stacksize = STACK_INIT_SIZE;
}

销毁栈

void DestroyStack(SqStack *S)
{
	free(S->base);
 	S->base = S->top = NULL;
 	S->stacksize = 0;
}

清空栈

void ClearStack(SqStack *S)
{
	S->top = S->base;
}

空栈检测

 
int StackEmpty(SqStack *S)
{
	int tmp = 0;
	if (S->base == S->top)
	{
		tmp = 1;
	}
	else
	{
		tmp = 0;
	}
	return tmp;
}

栈的长度

int StackLength(SqStack *S)
{
	return (int)(S->top - S->base);
}

获取栈顶

 
void GetTop(SqStack *S, SElemType *e)
{
	if (S->top == S->base)
	{
		exit(0);
	}
	else
	{
		*e = *(S->top - 1);
	}
}

入栈

 
void Push(SqStack *S, SElemType *e)
{
	if (S == NULL)
	{
		exit(0);
	}
	if (S->top - S->base >= S->stacksize)
	{
		S->base = (SElemType *)realloc(S->base, (S->stacksize + STACKINCREMENT) * sizeof(SElemType));
		if (!S->base)
		{
			exit(0);
		}
		S->top = S->base + S->stacksize;
		S->stacksize += STACKINCREMENT;
	}
	*(S->top++) = *e;
}

出栈

SElemType Pop(SqStack *S)
{
	if (S->top == S->base)
	{
		exit(0);
	}
	return *(--S->top);
}

栈的遍历

 
void StackTraversal(SqStack *S, void (*fp)(SElemType))
{
	SElemType *tmp = S->base;
	while (tmp < S->top)
	{
		(*fp)(*tmp);
		tmp++;
	}
}
栈的操作的序列是直线式的,即先一味地入栈,然后一味地出栈。为什么这一过程不直接用数组实现?当然数组是定长的缺点不是一个确切的答案。这个问题还可以扩展到队列、链表。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值