(数据结构)栈操作表示

头文件:

#include<iostream.h>
#include<stdlib.h>
#define STACK_INIT_SIZE 100   //存储空间初始分配量
#define STACKINCREMENT 10	  //存储空间分配增量
typedef int SElemType;
typedef int Status;
typedef struct{				 
	SElemType *base;		  //在栈构造之前和销毁之后,base的值为NULL
	SElemType *top;			  //栈顶指针
	int stacksize;			  //当前已分配的存储空间,以元素为单位
}SqStack;


Status InitStack(SqStack &S);		//构造一个空栈
Status DestroyStack(SqStack &S);    //销毁栈
Status ClearStack(SqStack &S);		//清空栈
Status StackEmpty(SqStack S);		//判断是否为空栈
Status IsSqStackFull(SqStack &S);   //判断是否为满
Status StackLength(SqStack S);		//返回栈元素的元素个数
Status GetTop(SqStack &S,SElemType &e);	//若栈不为空,则用e返回栈顶元素,并返回OK;否则返回error
Status Push(SqStack &S,SElemType e);	//插入元素e为新的栈顶元素
Status Pop(SqStack &S,SElemType &e);	//若栈不为空,则删除栈顶元素,用e返回其值,并返回OK;否则返回error
Status PrintSqStack(SqStack &S);        //输出栈元素

//构造一个空栈
Status InitStack(SqStack &S)
{
	S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
	if(!S.base)
	{
		cout<<"存储分配失败!"<<endl;
		return 0;
	}
	S.top=S.base;    //分配后为空栈的标志
	S.stacksize=STACK_INIT_SIZE;
	cout<<"初始化完成!"<<endl;
	return 1;
}		


//销毁栈
Status DestroyStack(SqStack &S)
{
	if(!S.base)
	{
		cout<<"不存在栈!"<<endl;
		return 0;
	}
	free(S.base);
	S.base=NULL;
	S.top=NULL;
	S.stacksize=0;
	cout<<"栈已销毁!"<<endl;
	return 1;
}   

//清空栈
Status ClearStack(SqStack &S)
{
	if(!S.base)
	{
		cout<<"不存在栈!"<<endl;
		return 0;
	}
	S.top=S.base;
	S.stacksize=0;
	return 1;
}

//判断是否为空栈	
Status StackEmpty(SqStack S)
{
	if(!S.base)
	{
		cout<<"不存在栈!"<<endl;
		return 0;
	}
	if(S.base==S.top)
	{
		cout<<"该栈为空栈!"<<endl;
	}	
	return 1;
}		

//返回栈元素的元素个数
Status StackLength(SqStack S)
{
	if(!S.base)
	{
		cout<<"不存在栈!"<<endl;
		return 0;
	}
	int i=0;
	while(S.base<=S.top-1)
	{
		i++;
		S.top=S.top-1;
	}
	cout<<"栈元素个数为:"<<i<<endl;
	return 1;
}

//若栈不为空,则用e返回栈顶元素,并返回OK;否则返回error		
Status GetTop(SqStack &S,SElemType &e)
{
	if(S.base==S.top)
	{
		cout<<"栈为空!不存在栈顶元素!"<<endl;
		return 0;
	}
	e=*(S.top-1);
	cout<<"栈顶元素为:"<<e<<endl;
	return 1;
}	

//栈是否为空
Status IsSqStackEmpty(SqStack &S)
{
	if(S.top==S.base )
	{
		cout<<"栈为空!"<<endl;
		return 1;
	}
	else
	{
		cout<<"栈不为空!"<<endl;
		return 0;
	}
}
//栈是否已满!
Status IsSqStackFull(SqStack &S)
{

	if(S.top>=S.base+STACK_INIT_SIZE)
	{
		cout<<"栈已满!"<<endl;
		return 1;
	}
	else
	{
		cout<<"栈未满!"<<endl;
		return 0;
	}
}
//插入元素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)
		{
			cout<<"存储分配失败!"<<endl;
			return 0;
		}
		S.top=S.base+S.stacksize;
		S.stacksize+=STACKINCREMENT;	//增加存储容量
	}
	*S.top++=e;
	/*
	S.base[S.top]=e;
	S.top=S.top+1;
	*/
	return 1;
}	

//若栈不为空,则删除栈顶元素,用e返回其值,并返回OK;否则返回error
Status Pop(SqStack &S,SElemType &e)
{
	if(S.top==S.base)
	{
		cout<<"栈为空!"<<endl;
		return 0;
	}
	e=*(S.top-1);
	S.top=S.top-1;
	//e=*--S.top;
	cout<<e<<endl;
	return 1;
}
/*
status GetSqStackTop(SqStack &s,ElementType &e)
{
	if(s.top >s.base)
	{
		e=*(s.top -1);
		return 1;
	}
	else
		return 0;
}	
*/

//输出栈元素
Status PrintSqStack(SqStack &S)
{
	SElemType *p;
	for(p=S.base; p<S.top; p++)
	{
		cout<<*p<<",";
	}
	cout<<endl;
	return 1;
}

源文件:

#include"stack.h"
void main()
{
	SqStack S;
	SElemType e;
	InitStack(S);
	int m,n;
	cout<<"请输入要插入的元素个数:";
	cin>>n;
	for(int i=0; i<n; i++)
	{
		cout<<"输入插入元素为:";
		cin>>m;
		Push(S,m);
	}
	PrintSqStack(S);//输出栈元素
	StackEmpty(S);//判断是否为空
	StackLength(S);//长度
	cout<<"栈顶元素为:";
	Pop(S,e);
	IsSqStackFull(S);//判断是否满
	ClearStack(S);//清空
	StackEmpty(S);//判断是否为空	
	DestroyStack(S);//销毁
}

执行结果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
vc++全版本组件大全 VC++运行时(Visual C++ Runtime)是VC++开发环境中用于支持C和C++程序运行的基础库集合。这些库包含了执行C/C++程序所必需的基本函数和数据结构,例如内存管理、字符串操作、输入输出处理、异常处理等。VC++运行时库分为静态库和动态库两种形式,以适应不同类型的项目需求。 静态链接库 vs 动态链接库 静态链接库(Static Linking Libraries):在编译时,静态库的代码会被直接嵌入到最终生成的可执行文件中。这意味着每个使用静态库的程序都会包含库代码的一个副本,导致最终程序的体积较大,但不需要外部库文件支持即可独立运行。在VC++中,静态链接库的例子有LIBC.lib(用于单线程程序)和LIBCMT.lib(用于多线程程序)。 动态链接库(Dynamic Link Libraries):与静态链接相反,动态库的代码并不直接加入到应用程序中,而是在程序运行时被加载。这使得多个程序可以共享同一份库代码,节省了系统资源。VC++的动态运行时库主要通过msvcrt.dll(或其变体,如MSVCRTD.dll用于调试版本)实现,与之配套的导入库(Import Library)如CRTDLL.lib用于链接阶段。 运行时库的版本 VC++运行时库随着Visual Studio版本的更新而发展,每个版本都可能引入新的特性和优化,同时保持向后兼容性。例如,有VC++ 2005、2008、2010直至2019等多个版本的运行时库,每个版本都对应着特定的开发环境和Windows操作系统。 重要性 VC++运行时对于确保程序正确运行至关重要。当程序在没有安装相应运行时库的计算机上执行时,可能会遇到因缺失DLL文件(如MSVCP*.dll, VCRUNTIME*.dll等)而导致的错误。因此,开发完成后,通常需要分发相应的VC++ Redistributable Packages给最终用户安装,以确保程序能够在目标系统上顺利运行。 安装与部署 安装VC++运行时库通常是通过Microsoft提供的Redistributable Packages完成的,这是一个简单的过程,用户只需运行安装程序即可自动安装所需组件。对于开发者而言,了解和管理不同版本的运行时库对于确保应用程序的广泛兼容性和可靠性是必要的。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值