【数据结构】栈定义及其常用的基本操作(C/C++)

news2024/11/18 11:25:23


目录

●图示(以顺序栈为例)

●栈的类型定义

●栈常用的基本操作

●顺序栈

●链式栈

●简单案例

1.顺序栈(这里只实现用顺序表存储3个学生的学号、姓名、年龄并且将其输出查看。若进行其他操作,对代码进行简单修改即可)

 2.链式栈(不做过多演示,对代码进行简单操作即可。如:输入一个学生的信息,并查看)


●图示(以顺序栈为例)


  ●栈的类型定义

1.顺序栈存储结构的定义

typedef struct{
	Selemtype *base;  //栈底指针 
	Selemtype *top;  // 栈顶指针 
	int stacksize;
}Sqstack;

实例如下:

typedef struct {
	char key[10];  //学号
	char name[20];  //姓名
	int age;   //年龄
}Selemtype;
typedef struct{
	Selemtype *base;  
	Selemtype *top;  
	int stacksize;
}Sqstack;

2.链式栈存储结构的定义(对照与链式表理解记忆http://t.csdn.cn/ypvSH)

typedef struct Stacknode {
	Selemtype data;
	struct Stacknode* next;
}Stacknode, * Linkstack;

 实例如下:

typedef struct {
    char key[10];
	char name[20];
    int age;
}Selemtype;
typedef struct Stacknode {
	Selemtype data;
	struct Stacknode* next;
}Stacknode, * Linkstack;

●栈常用的基本操作

●顺序栈

1.顺序栈的初始化

int Initstack(Sqstack& S)
{
	S.base = new Selemtype[maxsize];
	if (!S.base)
		exit(0);
	S.top = S.base;
	S.stacksize = maxsize;
	return 1;
}

2.判断顺序栈是否为空

int Stackempty(Sqstack& S)
{
	if (S.top == S.base)
		return 1;
	else
		return 0;
}

3.求顺序栈的长度

int Stacklength(Sqstack& S)
{
	return (S.top - S.base);
}

4.清空顺序栈

int Clearstack(Sqstack &S)
{
	if (S.base)
		S.top = S.base;
	return 1;
}

5.销毁顺序栈

int Destorystack(Sqstack& S)
{
	if (S.base)
	{
		delete S.base;
		S.stacksize = 0;
		S.base = S.top = NULL;
	}
	return 1;
}

6.顺序栈的入栈

int push(Sqstack& S, Selemtype e)
{
	if (S.top - S.base == S.stacksize)
		return 0;
	*S.top = e;
	S.top++;
	return 1;
}

7.顺序栈的出栈

int pop(Sqstack& S, Selemtype e)
{
	if (S.top == S.base)
		return 0;
	--S.top;
	e = *S.top;
	return 1;
}

●链式栈

1. 链栈的初始化

int Initstack(Linkstack& S)
{
	S = NULL;
	return 1;
}

2. 判断链栈是否为空

int Stackempty(Linkstack S)
{
	if (S == NULL)
		return 1;
	else
		return 0;
}

3. 链式栈的入栈

int Push(Linkstack& S, Selemtype e)
{
	Linkstack p;
	p = new Stacknode;
	p->data = e;
	p->next = S;
	S = p;
	return 1;
}

4. 链式栈的出栈

int Pop(Linkstack& S, Selemtype e)
{
	if (S == NULL)
		return 0;
	Linkstack p;
	e = S->data;
	p = S;
	S = S->next;
	delete p;
	return 1;
}

 5.取栈顶元素

Selemtype Gettop(Linkstack &S)
{
	if (S != NULL)
		return S->data;
}

●简单案例

1.顺序栈(这里只实现用顺序表存储3个学生的学号、姓名、年龄并且将其输出查看。若进行其他操作,对代码进行简单修改即可)

#include<iostream>
#define maxsize 100
using namespace std;
//数据准备
typedef struct {
	char key[10];
	char name[20];
	int age;
}Selemtype;
typedef struct{
	Selemtype* top;
	Selemtype* base;
	int stacksize;
}Sqstack;
//顺序栈的初始化
int Initstack(Sqstack& S)
{
	S.base = new Selemtype[maxsize];
	if (!S.base)
		exit(0);
	S.top = S.base;
	S.stacksize = maxsize;
	return 1;
}
//判断顺序栈是否为空
int Stackempty(Sqstack& S)
{
	if (S.top == S.base)
		return 1;
	else
		return 0;
}
//求顺序栈的长度
int Stacklength(Sqstack& S)
{
	return (S.top - S.base);
}
//清空顺序栈
int Clearstack(Sqstack &S)
{
	if (S.base)
		S.top = S.base;
	return 1;
}
//销毁顺序栈
int Destorystack(Sqstack& S)
{
	if (S.base)
	{
		delete S.base;
		S.stacksize = 0;
		S.base = S.top = NULL;
	}
	return 1;
}
//顺序栈的入栈
int push(Sqstack& S, Selemtype e)
{
	if (S.top - S.base == S.stacksize)
		return 0;
	*S.top = e;
	S.top++;
	return 1;
}
//顺序栈的出栈
int pop(Sqstack& S, Selemtype e)
{
	if (S.top == S.base)
		return 0;
	--S.top;
	e = *S.top;
	return 1;
}
//查看栈顶元素
void top(Sqstack& S)
{
	if (S.top == 0)
		exit(0);
	S.top--;
	cout << S.top->key << " " << S.top->name << " " << S.top->age << endl;
}
void showfunc()
{
	cout << "1.顺序栈的初始化" << endl;
	cout << "2.判断顺序栈是否为空" << endl;
	cout << "3.求顺序栈的长度" << endl;
	cout << "4.清空顺序栈" << endl;
	cout << "5.销毁顺序栈" << endl;
	cout << "6.顺序栈的入栈" << endl;
	cout << "7.顺序栈的出栈" << endl;
	cout << "8.查看栈顶元素" << endl;
}
void text()
{
	Sqstack S;
	Selemtype data;
	while(1)
	{ 
		showfunc();
		cout << "#要执行的操作#" << endl;
		int n;
		cin >> n;
		switch (n)
		{
		case 1:
			Initstack(S);
			cout << "初始化完成" << endl;
			break;
		case 6:
			cout << "请输入要输入的学生人数:" << endl;
			int num; cin >> num;
			for (int i = 1; i <= num; i++)
			{
				cin >> data.key >> data.name >> data.age;
				push(S,data);
			}
			cout << "插入成功" << endl;
			break;
		case 8:
			top(S);
			break;
		}
		system("pause");
		system("cls");
	}
}
int main()
{
	text();
}

 

 2.链式栈(不做过多演示,对代码进行简单操作即可。如:输入一个学生的信息,并查看)

#include<iostream>
using namespace std;
typedef struct {
	char key[10];
	char name[20];
	int age;
}Selemtype;
typedef struct Stacknode {
	Selemtype data;
	struct Stacknode* next;
}Stacknode, * Linkstack;
//链栈的初始化
int Initstack(Linkstack& S)
{
	S = NULL;
	return 1;
}
//判断链栈是否为空
int Stackempty(Linkstack S)
{
	if (S == NULL)
		return 1;
	else
		return 0;
}
//链式栈的入栈
int Push(Linkstack& S, Selemtype e)
{
	Linkstack p;
	p = new Stacknode;
	p->data = e;
	p->next = S;
	S = p;
	return 1;
}
//链式栈的出栈
int Pop(Linkstack& S, Selemtype e)
{
	if (S == NULL)
		return 0;
	Linkstack p;
	e = S->data;
	p = S;
	S = S->next;
	delete p;
	return 1;
}
//取栈顶元素
void  Gettop(Linkstack &S)
{
	if (S != NULL)
		cout << S->data.key<< S->data.name << S->data.age << endl;
}
void text()
{
	//不做过多演示,对代码进行简单操作即可
	Linkstack S;
	Selemtype Data;
	Initstack(S);
	cout << "初始化成功" << endl;
	cout << "输入一个学生的数据:" << endl;
	cin >> Data.key >> Data.name >> Data.age;
	cout << "将学生信息推入链栈中" << endl;
	Push(S,Data);
	cout << "查看栈顶元素" << endl;
	Gettop(S);
}
int main()
{
	text();
}


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/82513.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Read IDS scan文件

IDS 雷达的文件格式比原来的。dt格式文件复杂&#xff0c;由于数据来自检测单位&#xff0c;对文件的理解并不到位。 采集的数据如下&#xff1a; 产生的文件很多&#xff0c;比如这次有2个采集 Data内部的文件 很多文件并没有理解到 3 文件说明 3.1 pos 结尾是 但距离与最后…

Mysql高频面试题(二)

文章目录1. 平衡二叉树、红黑树、Hash结构、B树和B树的区别是什么&#xff1f;2. 一个B树中大概能存放多少条索引记录&#xff1f;3. 使用B树存储的索引crud执行效率如何&#xff1f;4. 什么是自适应哈希索引&#xff1f;5. 什么是2-3树 2-3-4树&#xff1f;6. 为什么官方建议使…

边界安全防护方案

汽车制造业 MES系统 DNC系统 生产 安全域1 管理层 工控安全隔离装置 交换机 安全配置核查系统 HMI 历史数据库 运行监控系统 实时数据库 打印机 过程 安全域2 监控层 工控漏洞扫描系统 安全交换机 工控安全审计系统 工控入侵检测系统工程师站 A 操作员站 A 实时数据库A 操作员…

测试员做外包能转正吗?外包员工能变正式员工吗?

外包员工能变正式员工吗&#xff1f;这里辟谣一波&#xff0c;许多外包都说有转正机会。实际情况是几乎等于零。其中&#xff0c;三方外包更是可以直接和零划等号。三方外包的转正&#xff0c;往往就是给个内推机会&#xff0c;然后和面试官会熟悉一些。 然而这些都没什么价值…

简述基于JavaEE企业级开发技术(Spring)

一、绪论 1、学习内容 javaEE企业开发技术概述javaEE容器——SpringORM数据层——MyBatis/JPAWeb层——Spring MVC展现层——JSP/Thymeleaf整合框架——SSM/SSH用户模块分析用户模块功能模块设计 前端框架&#xff1a;Bootstrap&#xff0c;NodeJS&#xff0c;Vue/React/Ang…

聊一聊世界杯的半自动越位技术

一、前言 11 月 22 日&#xff0c;在卡塔尔卢赛尔球场进行的 2022 卡塔尔世界杯足球赛 C 组比赛中&#xff0c;阿根廷队以 1 比 2 不敌沙特阿拉伯队&#xff0c;我相信哥很多人都不敢相信&#xff0c;阿根廷居然又输了&#xff0c;而沙特取得亚洲球队在本届世界杯的首场胜利。…

【Pytorch】第 9 章 :Capstone 项目——用 DQN 玩 Flappy Bird

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

一文了解瀑布式项目管理和敏捷项目管理的区别!

众所周知&#xff0c;项目管理起源于软件开发行业&#xff0c;而目前已广泛应用于各行各业&#xff0c;完整的项目管理包含五个部分&#xff0c;分别是&#xff1a;项目启动、项目规划、项目执行、项目监控、项目收尾。随着行业的发展&#xff0c;传统的瀑布式项目管理模式&…

海外跨境电商5大关键趋势,Starday带你先发制人

受新冠疫情的影响&#xff0c;海外市场需求总体而言有所下降&#xff0c;然而随着我国跨境出口产品向更大出口量级、更多出口品类以及更高客单价的趋势发展&#xff0c;跨境出口电商行业却有着快速发展&#xff0c;基于主流跨境电商平台相关数据和中国卖家调研&#xff0c;报告…

卓越工程之单元测试在行权鉴权中的实践

前言 在去年的时候就读过《重构&#xff1a;改善既有代码的设计》这本在代码重构领域里的经典&#xff0c;当时在读的时候就苦于有这么两点导致只停留在了“读”上面&#xff0c;而缺少实践。 1.全书内容比较枯燥乏味&#xff0c;虽然有部分代码示例&#xff0c;但是语言并不…

新能源车的火烧到了二手车市场

今年以来&#xff0c;新能源二手车市场有明显回暖的迹象。据中国汽车流通协会数据显示&#xff0c;今年上半年&#xff0c;新能源二手车交易量达15.6万辆&#xff0c;同比增长36.4&#xff05;&#xff0c;比传统燃油车增速高出24.5个百分点。另据瓜子二手车大数据显示&#xf…

Android平台GB28181设备接入端预置位查询(PresetQuery)探讨和技术实现

之前blog介绍了GB28181云台控制&#xff08;PTZCmd&#xff09;相关&#xff0c;本文主要是介绍下GB28181预置位查询。 预置位这块&#xff0c;在处理带云台的设备非常必要&#xff0c;我们主要是做Android平台的GB28181的设备接入端&#xff0c;也可以转发RTSP摄像头接入到国…

F3--FPGA读写EEPROM实例2022-12-12

1.EEPROM简介 EEPROM (Electrically Erasable Programmable read only memory)是指带电可擦可编程只读存储器。是一种掉电后数据不丢失的存储芯片。在嵌入式控制系统中常常用来保存设备初始化所需数据。发展过程&#xff1a;ROM – > PROM –> EPROM –> EEPROM&…

移动Web基础知识点大全

移动Web基础知识点大全移动Web1、字体图标2、平面转换3、渐变4、空间转换5、动画6、移动端特点7、百分比布局8、Flex布局9、移动适配9.1 rem9.2 less9.3 vw/vh10、媒体查询11、BootStrap移动Web 1、字体图标 目标&#xff1a;使用字体图标实现网页中简洁的图标效果字体图标 字…

数据技术篇之实时技术

第5章 实时技术 在大数据系统中&#xff0c;离线批处理技术可以满足非常多的数据使用场景需求&#xff0c;但在 DT 时代&#xff0c; 每天面对的信息是瞬息万变的&#xff0c;越来越多的应用场景对数据的时效性提出了更高的要求。数据价值是具有时效性的&#xff0c;在一条数据…

霸榜,这本《程序员如何向架构师转型》在Github已持续置顶两月

前言 企业架构在过去十年中取得了长足的进步。随着越来越多新技术出现&#xff0c;充分利用这些因素来将企业架构创建得更好十分重要。通过将新技术集成到企业架构中&#xff0c;即使在困难时期&#xff0c;也能取得丰硕的成果。 现代企业架构师的 5 个特征&#xff1a; 1. …

移动端插件-IScroll列表滑动、区块滑动

iScrol l是一个高性能&#xff0c;资源占用少&#xff0c;无依赖&#xff0c;多平台的javascript滚动插件(4kb)。 官方&#xff1a; iScroll 访问不了 (iscrolljs.com) iScroll github (https://github.com/cubiq/iscroll) -> build 文件夹 包含各个版本 iScroll 中文…

国内智能手表行业数据浅析

大家好&#xff0c;这里是小安说网控。 智能手表&#xff0c;作为智能穿戴的一种&#xff0c;大大方便了人们的生活。 2022年9月份&#xff0c;我国智能手表产量当期值695.6万个&#xff0c;同比增长21.4%&#xff1b;10月份当期值为552.6万个&#xff0c;同比下滑16.5%。1-10月…

宝塔面板打不开怎么登录进入宝塔页面

浏览器新建标签页&#xff0c;输入服务器公网地址ip&#xff0c;后面加:8888&#xff0c;例如 1.2.3.4:8888 &#xff08;服务器公网地址IP可在云服务器 → 实例→公网IP 查看&#xff09; 删除默认用户名&#xff0c;创建设置你的用户名和密码&#xff0c;确定&#xff0c;登陆…

基于不可否认技术的珍贵古籍线上交易系统设计与实现(JavaWeb的图书商城系统)

目 录 摘 要 I ABSTRACT I 引言 1 1 绪论 1 1.1 课题背景与意义 1 1.2 本文的总体结构 1 2 开发工具及技术 2 2.1 开发工具 2 2.1.1 前台使用技术 2 2.1.2 后台使用技术 2 2.1.3 后端使用技术 3 2.2 B/S架构 3 2.3 软硬件需求 3 3 系统的需求分析和概要设计 3 3.1 可行性分析 3…