我是靠谱客的博主 聪明小天鹅,最近开发中收集的这篇文章主要介绍顺序栈的表示与c语言实现之动态分配型,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

顺序栈的表示与c语言实现<动态分配型>

#define STACK_INIT_SIZE 100  //存储空间初始分配量
#define STACKINCREMENT 10  //存储空间的分配增量<相对初始分配量较小,视具体情况而定>
typedef struct{
	SElemType *base; //定义类型为SElemType类型的指针指向栈底,即栈底指针
	                 //在栈构造之前和销毁之后,base的值为NULL
	SElemType *top;  //定义栈顶指针,指向栈顶元素的下一个位置 ①
	int stacksize;  //定义当前存储空间总量stacksize,以元素SElemtype为单位
}SqStack;   

1,创建并初始化顺序栈

int InitStack(SqStack *S)
{
	//1.动态申请存储空间
	S->base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
    //判断是否申请成功
	if(!S->base) return 0;    //S->base==NULL;
	//2.初始化SqStack结构各个成员 
	S->top=S->base;
	S->stacksize=STACK_INIT_SIZE;
	return 1;
} 

2,判栈空,空返回1,否则返回0

int StackEmpty(SqStack S)
{
	//若栈顶指针指向栈底则栈为空
	if(S.top==S.base)return 1;
	else return 0;   //return S.top==S.base?1:0;
} 

3,判栈满,满返回1,否则返回0

int StackFull(SqStack S)
{
	if(S.top-S.base==S.stacksize) return 1;
	else return 0;  //return S.top-S.base==S.stacksize?1:0;
} 

4,入栈 成功插入返回1,否则返回0

int Push(SqStack *S,SElemType e)
{
	//栈满,申请分配更多空间 
	if(S->top-S->base==S->stacksize)
	{
		SElemType *newbase=(SElemType *)realloc(S->base,(S->stacksize+
		STACKINCREMENT)*sizeof(SElemType));
		if(newbase==NULL)return 0;
		//一旦空间申请成功,SqStack结构中各结构成员需更新
		S->base=newbase; 
		S->top=S->base+S->stacksize;
		S->stacksize+=STACKINCREMENT;
	}
	//入栈
	*(S->top)=e;
	S->top++; 
	return 1;
} 

5,出栈,并用e返回栈顶元素

int Pop(SqStack *S,SElemType *e)
{
	if(S->base==S->top)return 0;//判空
	S->top--;
	*e=*(S->top);
	return 1;
} 

6,获取栈顶元素并用e返回

int GetTop(SqStack S,SElemType *e)
{
	if(S.base==S.top)return 0;//判空 
	S.top--;
	*e=*(S.top); //取出栈顶指针所指元素的值并赋值给e
	return 1;
}

7,访问栈中元素

int StackTraverse(SqStack S,void(*visit)(SElemType))
{                            //函数指针做函数参数②
    //1.首先用一指针指向栈顶元素<定位>
	SElemType *p=S.top-1;
	//2.循环遍历各个元素
	while(p>=S.base)
	{
		visit(*p);  //调用visit()方法实现具体操作 
		p--;
	}
} 

8,清空栈

int ClearStack(SqStack *S)
{
	//1.判空,若栈本为空,返回0
	if(S->top==S->base)return 0;
	S->top==S->base;
	return 1;
} 

9,销毁栈

int DestroyStack(SqStack *S)
{
	//判空,若栈本为空,返回0
	if(S->top==S->base)return 0;
	free(S->base);  //释放空间 
	S->base=S->top=NULL;  //指针为空 
	S->stacksize=0; //栈中无元素 
	return 1; 
} 

①关于栈顶指针具体指向,见博文<顺序栈栈顶指针指向详析>https://blog.csdn.net/qq_45818316/article/details/105092531
②函数指针部分详析,见博文<函数指针与指针函数>


本博文来自学习记录,如有不正确的地方欢迎各位大神指正 ^ – ^

最后

以上就是聪明小天鹅为你收集整理的顺序栈的表示与c语言实现之动态分配型的全部内容,希望文章能够帮你解决顺序栈的表示与c语言实现之动态分配型所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(55)

评论列表共有 0 条评论

立即
投稿
返回
顶部