大话数据结构之栈

栈(stack)

定义:限定仅在表尾进行插入与删除操作的线性表。

栈的操作特点:就是后进先出(Last in First out ).

(1) 栈顶(top):允许插入语删除的一端。

(2) 栈底(base):位于栈的底部,固定不动。

栈的插入操作,称为进栈,入栈。

栈的删除操作,成为出栈,弹栈。如图:



实现代码:

typedef int  SElemType;
typedef int Status;

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

Status Visit(SElemType s)
{
	printf("%3d",s);
	return OK;
}

/*
****操作结果:初始化空栈
*/
Status InitStack(SqStack *S)
{
	S->base = (SElemType *)malloc(StackSize*sizeof(SElemType));

	if(!S->base)
		exit(OVERFLOW);
	S->top = S->base;
	S->stacksize = StackSize;
	return OK;
}

/*
*****初始条件:栈S已经存在
*****操作结果:若S为空,返回1,否则S不空,返回0
*/
Status EmptyStack(SqStack S)
{
	if(S.base == S.top)
		return TRUE;
	else 
		return FALSE;
}

/*
*****初始条件:栈S已经存在
*****操作结果:栈S被置为空栈
*/
Status ClearStack(SqStack *S)
{
	if(S->top == S->base)
		printf("栈已为空栈\n");
	else
		S->top = S->base;
	return OK;
}

/*
****初始条件:栈S已经被初始化
****操作结果:插入元素 e 为栈顶元素
*/
Status Push(SqStack *S,SElemType e)
{
	if(S->top - S->base >= S->stacksize)            //栈满
	{
		S->base = (SElemType *)realloc(S->base,(S->stacksize + StackIncrement)
			       *sizeof(SElemType));
		if(!S->base)
			exit(OVERFLOW);
		S->top = S->base + S->stacksize;
		S->stacksize += StackIncrement;
	}

	*(S->top++) = e;
	return OK;
}

/*
****初始条件:栈S已经存在
****操作结果:用e返回栈顶元素,并返回OK,否则返回ERROR
*/
Status GetTop(SqStack *S,SElemType *e)
{
	if(S->top == S->base)
		return ERROR;
	S->top--;
	*e = *(S->top);
	return OK;
}

/*
****总结:注意与GetTop()的区别,最重要的区别就是:都用到 (SElemType *e)而不是(SElemType e)
****      因为*e 为地址传递。e 为值传递。但是在main()中,没有对e初始化。而且
****      e 是用来存储 栈顶元素的。不应该被初始化。故应该采用地址传递方式即 *e.
****      直接对e进行操作。
*/   
Status GetTop1(SqStack S,SElemType *e)
{
	if(S.top == S.base)
		return ERROR;
	S.top--;
	*e = *S.top;
	return OK;
}

/*
****初始条件:栈S已经存在
****操作结果:若栈不空,则删除栈顶元素,并用e 返回其值,并返回OK;否则返回ERROR
*/
Status Pop(SqStack *S,SElemType *e)
{
	if(S->top == S->base)                      //栈空。
		return ERROR;
	*e = *(--S->top);
		return OK;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值