栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

栈的基本操作(详细代码/可视化操作)(顺序栈/链栈)《数据结构》C语言版

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

栈的基本操作(详细代码/可视化操作)(顺序栈/链栈)《数据结构》C语言版

栈比前面的链表容易的多了去了

有限制,只要处理尾巴就可以了

不如链表增加插入删除花里胡哨头疼

优化来自@lady_killer9的代码

#include
#include
#include
using namespace std;
typedef struct Z{
	int *base;			//栈底·不变·指向首元素 
	int *top;			//栈顶·初始也指向首元素 
	int max;			//栈可用的最大容量100
};


//《功能组件·模块》 
int init(Z &s,int t){	//《初始化》 
	int n=10;
	if(t==2){
		printf("请规定栈的极限:");
		scanf("%d",&n);
	}
	s.base=new int[n];		//动态分配最大容量(一片连续的内存) 
	if(!s.base){			//没有捕获头指针 
		printf("分配失败n");
		return 0;
	}
	s.top=s.base;	//栈顶指针与栈底相同
	s.max=n;
	return 1;
}
bool Push(Z &s,int e){	//《入栈》
	if(s.top-s.base==s.max) return false;//栈满
	*(s.top++)=e;			return true;//头指针启动时指向空区,直接进来就可以 
	//直接给 头指针 指向的 那一片区域 赋值,实际上是存在base里,只是内存上连续 
}
bool Out(Z &s,int &e){	//《出栈》
	if(s.top==s.base) 	return false;//栈空
	e=*(--s.top);		return true;//启动时,栈顶指针指向上方的空区待命,等待输入 
	//先往下一个才是指向 现存的栈顶 
}
bool Get(Z s,int &e){	//《栈顶元素》 
	if(s.top==s.base) 	return false;//栈空			
	else e=*(--s.top);	return true;
}
int k(Z s){			//《判空/摧毁》 
	if		(s.top==s.base&&s.top!=NULL&&s.base!=NULL) 	return 1;
	else if	(s.top==NULL&&s.base==NULL)					return 2;
	else 												return 0;
} 	
bool destory(Z &s){//《摧毁》 
	free(s.base);	//底部指针是相当于数组,有空间要释放 
	s.base = NULL;
	s.top = NULL;	//其他两个只是指针,置零即可 
	s.max=0;
	return true;
}
bool clear(Z &s){//《清空》 
	if(k(s)==2)	return false;
	s.top = s.base;
}
int len(Z s){//《长度》 
	int *t=s.top-1,k=0;
	for(;t>=s.base;t--)	k++;
	return k;
}


//《显示组件·模块》
void menu(int &t){
	printf("********1.入栈      2.出栈*********n");
	printf("********3.栈顶      4.新建栈*******n");
	printf("********5.清空      6.摧毁*********n");
	printf("请输入菜单序号:");scanf("%d",&t);
}
bool in(Z &s){
	int n,e;	bool flag;
	if(k(s)==2)	return false;
	printf("请输入入栈元素个数(>=1):");
	scanf("%d",&n);
	printf("依次输入入栈元素:");
	for(int i=0;ilen(s)||n<0)	printf("输入不合法!n");
	else{
		for(int i=0;is.base;t--)
			printf("%d ",*t);
		printf("%d》栈底n",*t);
		printf("总长度:%dnn",len(s));
		return 0;
	}
}


int main(){
	Z s;int t;
	init(s,1);
	while(1){
		system("cls");print(s);
		if	(k(s)==1)		printf("这是个空栈~nnn");
		if	(k(s)==2)		printf("栈已被摧毁!nnn");
		menu(t);
		switch(t){
			case 1:in(s);		break;
			case 2:out(s);		break;
			case 3:get(s);		break;
			case 4:init(s,2);	break;
			case 5:clear(s);	break;
			case 6:destory(s);	break; 
			default:printf("输入错误!!n");
		}
		printf("n");
		system("pause");
 	}
 	return 0;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/290151.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号