栈的基本操作

栈的顺序存储结构:

#define STACK_SIZE 10 //存储空间初始分配量
#define STACK_INCREMENT 2  //存储空间分配增量

struck SqStack {//顺序栈
	SElemType *base;//在构造之前和摧毁之后,base的值为NULL
	SElemType *top;//栈顶指针
	int stacksize;//当前已分配的存储空间,以元素为单位
};

栈的基本操作:

(1)初始化栈

//构造一个空栈
void InitStack(SqStack &s){
	S.base = (SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
	if(!S.base)
		exit(OVERFLOW);//动态分配存储空间失败,则退出
	S.top=S.base;//栈顶元素指向栈底(空栈)
	S.stacksize=STACK_INIT_SIZE;//存储空间为初始分配量
}

(2)销毁栈

//销毁栈S,S不再存在
void DestroyStack(SqStack &s){
	free(S.base);//释放栈空间
	S.top=S.base=NULL;//栈顶、栈底指针均为空
	S.stacksize=0;//当前已分配的存储空间为0
}

(3)清空栈

//把栈S置为空栈
void ClearStack(SqStack &S){
	S.top=S.base;//栈顶指针指向栈底
}

(4)判断栈是否为空

//若栈S为空栈,则返回TRUE;否则返回FALSE
Status StackEmpty(SqStack S){
	if (S.top==S.base)//空栈条件
		return TRUE;
	else
		return fALSE;
}

(5)判断栈的长度

//返回栈S的元素个数,即栈的长度
int StackLength(SqStack S){
	return S.top-S.base;
}

(6)获得栈顶元素

//若栈S不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR
Status GetTop(SqStack S,SElemType &e){
	if(S.top > S.base){//栈不空
		e=*(S.top-1);//将栈顶元素赋值给e
		return OK;
	}
	else
		return ERROR;
}

(7)入栈

//插入元素e为栈S新的栈顶元素
void Push(SqStack &S,SElemType e){
	if (S.top-S.base==S.stacksize){//栈满
		S.base=(SElemType*)realloc(S.base,(S.stacksize+STACK_INCREMENT)*sizeof(SElemType));//追加存储空间
		if(!S.base)//追加存储空间失败,则退出
			exit(OVERFLOW);
		S.top=S.base+S.stacksize;//修改栈顶指针,指向新的栈顶
		S.stacksize+=STACK_INCREMENT; //更新当前已分配的存储空间
	}
	*(S.top)++=e;//将e入栈,成为新的栈顶元素,栈顶指针上移一个存储单元
}

(8)出栈

//若栈S不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
Status Pop(SqStack &S,SElemType &e){
	if(S.top==S.base)//栈空
		return ERROR;
	e= * --S.top;//将栈顶元素赋值给e,栈顶指针下移一个存储单元
	return OK;
}

(9)遍历栈

//将栈底到栈顶依次对栈S中每一个元素调用函数visit()
void StackTraverse(SqStack S,void(*visit)(SElemType)){
	SElemType * p=S.base;
	while(S.top>p)//p指向栈元素
		visit(*p++);//对该栈元素调用visit(),p指针上移一个存储单元
	printf("\n");
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值