河南大学数据结构实验-顺序栈和链栈的实现

news2024/12/29 19:08:48

计算机与信息工程学院实验报告

姓名:杨馥瑞  学号:2212080042 专业:数据科学与大数据技术 

年级:2022

课程:数据结构  主讲教师:袁彩虹老师 辅导教师:_______                 

实验时间:2024年 __月 ___日 __午__时至__时,实验地点_413_

实验题目:栈和队列的操作

实验目的:本实验项目可以支撑“实验目标1. 熟练掌握线性表(包括顺序表、链表、栈和队列)的存储方式及其操作实现。”。

本实验通过验证方式引导学生掌握顺序栈和链栈的基本操作,循环队列和链队列的基本操作,为后续学习打下基础,以便更好地达成后续更高层次的课程目标

实验环境(硬件和软件)Dev c++ & windows11 x64

实验内容:

(1)编程实现顺序栈和链栈的基本操作:建栈,取栈顶元素,入栈,出栈;

(2)编程实现循环队列和链队列的基本操作:建队列,取队头元素,入队,出队。

实验步骤:

实验内容(1)顺序栈:

结构体预定义顺序栈

顺序的初始化

判断是否为空栈

这里定义成了布尔类型

进栈

出栈

读取栈顶元素

返回栈长度

制空栈

销毁栈

测试主函数

实验内容(2)链栈:

感觉再比这顺序栈写听没新意的,来用c++规范的类来实现吧!

结构体预定义链栈

声明一个链栈类,并构造函数初始化

判断是否为空

进栈

出栈

得到头节点

制空栈

得到栈长度

析构函数销毁栈

测试主函数

实验数据记录:

顺序栈的:

链栈的:

结果经验吗!就是感觉涉及到内存处理,感觉还是java爽,每次写链式的无论是链表还是链栈都要将结点释放,不像java可以自动处理,无指向的结点。

还有吗!等听完课再补充吧,目前没啥想法,感觉用c++类实现更酷一点,但是费脑细胞

源代码:

#include<bits/stdc++.h>
using namespace std;
#define MaxSize 50
#define ElemType int

typedef struct{
	ElemType *data;//存放元素
	int top; 
}SqStack;

//初始化栈
void InitStack(SqStack &S){
	if(S.data!=NULL){
		printf("出错!栈已创建");
	}else{
		S.top = -1;
		S.data = new int[MaxSize];
	}
	
} 

//判断栈是否为空
bool StackEmpty(SqStack S){
	if(S.top == -1){
		return true;//空 
	}else
	return false;//非空 
}

//进栈
bool Push(SqStack &S,ElemType x){
	if(S.top==MaxSize-1){
		return false;//栈满了 
	}
	S.data[++S.top]=x;//指针加一接着入栈
	return true; 
}

//出栈
bool Pop(SqStack &S,ElemType &x){
	if(S.top==-1)
	return false;//空栈无法出栈 
	x = S.data[S.top--];
	return true;//先出栈再减一 
} 

//读取栈顶元素
ElemType GetTop(SqStack S){
	if(S.top==-1){
		return -1;//空栈 
	}
 
	return S.data[S.top];
} 

//返回栈长度
int Length(SqStack S){
	return S.top+1;
} 

//制空栈
int ClearStack(SqStack &S){
	S.top = -1;
} 

//销毁栈
void DestoryStack(SqStack &S){
	S.top = -1;
	free(S.data);
	S.data = NULL;
} 
 
int main(){
	SqStack S;
	S.data = NULL;
	//初始化
	InitStack(S);
	//判断是否为空 
	if(StackEmpty(S)){
		printf("栈为空!\n");	
	} else{
		printf("栈非空!\n");
	}
	//将 1-5 进栈 
	if(Push(S,1)&&Push(S,2)&&Push(S,3)&&Push(S,4)&&Push(S,5)){
		printf("已经进栈\n");
	}else{
		printf("出错!\n");
	}
	//输出此时栈长度
	printf("栈长度为 %d\n",Length(S)); 
	//输出此时的栈顶元素
	printf("栈顶元素为 %d\n",GetTop(S)); 
	//出栈两个元素
	ElemType x1,x2;
	if(Pop(S,x1)&&Pop(S,x2)){
		printf("已经出栈成功!\n");
		printf("出栈元素为 %d,%d\n",x1,x2); 
	} else{
		printf("出错!\n"); 
	}
	//输出此时栈长度
	printf("栈长度为 %d\n",Length(S)); 
	//销毁栈
	DestoryStack(S);
	//看看销好了么 
	if(StackEmpty(S)){
		printf("栈为空!\n");	
	} else{
		printf("栈非空!\n");
	}
	return 0;
}
#include <iostream>
using namespace std;
#define ElemType int

struct Node {
    int data;
    Node* next;

    Node(int value) : data(value), next(NULL) {}//构造函数初始化一下 
};

class LinkedStack {
private:
    Node* top;//结点指针 
    int length;//长度 

public:
    LinkedStack() : top(NULL), length(0) {}
	//判断是否为空 
    bool isEmpty() {
        return top == NULL;
    }
	//进栈 
    void push(int value) {
        Node* newNode = new Node(value);
        newNode->next = top;
        top = newNode;
        length++;
    }
	//出栈 
    bool pop(ElemType &x) {
        if (isEmpty()) {
            return false;
        }
        Node* temp = top;
        x = top->data;
        top = top->next;
        delete temp;
        length--; 
        return true;
    }
	//得到头节点元素 
    int getTop() {
        if (isEmpty()) {
            return -1;  // 空栈
        }

        return top->data;
    }
	//制空栈 
    void clearStack() {
        while (!isEmpty()) {
            Node* temp = top;
        	top = top->next;
        	delete temp;
        }
    }
    //得到栈长度 
	int getLength(){
		return length;
	}
	//析构函数 
    ~LinkedStack() {
        clearStack();
    }
};

int main() {
    LinkedStack stack;

    if (stack.isEmpty()) {
        cout << "栈为空!" << endl;
    } else {
        cout << "栈非空!" << endl;
    }

    stack.push(1);
    stack.push(2);
    stack.push(3);
    stack.push(4);
    stack.push(5);

    cout << "已经进栈" << endl;
    cout << "栈顶元素为 " << stack.getTop() << endl;

    int x1, x2;
    if (stack.pop(x1) && stack.pop(x2)) {
        cout << "已经出栈成功!" << endl;
        cout << "出栈元素为 " << x1 << ", " << x2 << endl;
    } else {
        cout << "出错!" << endl;
    }

    cout << "栈长度为 " << stack.getLength() << endl;

    stack.clearStack();

    if (stack.isEmpty()) {
        cout << "栈为空!" << endl;
    } else {
        cout << "栈非空!" << endl;
    }

    return 0;
}

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

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

相关文章

【STL】set容器、pair队组与map容器

目录 1.修改set容器排序规则 2. set容器的各种函数 3.set构造函数multiset 4.创建pair队组 5.map容器 1.修改set容器排序规则 set容器会自动以升序的方式进行排序&#xff0c;想要改变可以制定排序规则&#xff0c;set<int,排序规则> s&#xff1b; 但需要注意&am…

Notepad++从文件夹查找文本内容

目录 一、背景二、Notepad搜索2.1 测试用例2.2 操作说明 一、背景 在日常的办公、学习或编程中&#xff0c;我们时长会遇到需要在大量文件中搜索特定文本内容的情况&#xff1a; 无论是快速定位某个项目中的代码片段&#xff1b;还是检索文档资料库中的相关信息等。 掌握如何…

【Python数据结构与判断5/7】列表的便捷操作

目录 目标 追加 列表的追加 列表的插入 生活场景应用 列表删除元素 变量作为列表元素 Debug 总结 目标 昨天&#xff0c;我们学习了列表&#xff0c;使用索引修改列表中的元素&#xff0c;以及通过切片获取指定元素。 今天我们会学习&#xff0c;如何在列表中追加元素、…

mysql数据库备份学习笔记

数据库备份 方法1 物理备份&#xff1a;xtrabackup 方法2 逻辑备份 mysqldump 参考备份与恢复的方法&#xff1a; 【MySql】Mysql之备份与恢复_mysql数据库备份与还原-CSDN博客 可以借鉴的物理备份&#xff1a; 思路是 先做一次全量备份&#xff0c;然后每天做一次增量备份…

Flask 专题

[CISCN2019 总决赛 Day1 Web3]Flask Message Board 查看session解密 但不知道密钥&#xff0c;题目说FLASK,那肯定就是找密钥,发现输入什么都没有显示&#xff0c;只有author那里有回显在版上&#xff0c;所以尝试sstl&#xff0c;{{config}}找到密钥 扫目录发现有admin进入…

AttributeError: cannot assign module before Module.__init__() call

原因 调用了自定义的类&#xff0c;但是在自定义的类的__init__函数下面没有写super( XXX, self ).init() 错误案例 import torch import torch.nn as nnclass SelfAttention(nn.Module):""" Self-Attention """def __init__(self, n_head, d…

四、MySQL

MySQL MySQL1.初识网站2.安装MySQL2.1 下载&#xff08;最重要的一点是路径中不能有中文&#xff0c;哪怕是同级目录也不行&#xff09;2.2安装补丁2.3安装2.4创建配置文件2.5初始化 3.启动MySQL4.连接测试4.1 设置密码4.2 查看已有的文件夹&#xff08;数据库&#xff09;4.3 …

深入浅出:Objective-C中使用MWFeedParser下载豆瓣RSS

摘要 本文旨在介绍如何在Objective-C中使用MWFeedParser库下载豆瓣RSS内容&#xff0c;同时展示如何通过爬虫代理IP技术和多线程提高爬虫的效率和安全性。 背景 随着信息量的激增&#xff0c;爬虫技术成为了获取和处理大量网络数据的重要手段。Objective-C作为一种成熟的编程…

速卖通安全测评补单技术提升运营安全性

对于一个新品来说&#xff0c;最大的问题就是评论。没有评论&#xff0c;你的广告就不能打的很靠前&#xff0c;那样你的转化率就会非常低&#xff0c;数据也很差。新品运气不好的来两个一星差评&#xff0c;链接可能就此废掉&#xff0c;做不上去了。所以虽然平台管的非常的严…

使用R语言计算模拟二项分布

二项分布理论 二项分布是一种离散概率分布&#xff0c;描述了在n次独立重复的伯努利试验中成功的次数的概率分布。其中&#xff0c;每次试验的结果只有两个可能&#xff1a;成功或失败&#xff0c;且每次试验的成功概率p是相同的。 具体来说&#xff0c;如果随机变量X表示在n次…

牛牛的凑数游戏 --- 题解

目录 牛牛的凑数游戏&#xff1a; 题目大意&#xff1a; 思路解析&#xff1a; 代码实现&#xff1a; 牛牛的凑数游戏&#xff1a; 题目大意&#xff1a; 思路解析&#xff1a; 我们可以很容易一个区间是否会存在1&#xff0c;那么我们想如果存在1&#xff0c;且有3个1&…

HANA VIEW 用 ABAP 创建CDS VIEW,在生成ODATA

这里我们做ADT来创建 场景介绍&#xff1a;把hana中的一个底表&#xff0c;创建成ABAP的 CDS VIEW &#xff0c;在把CDS VIEW 生成 OData 服务。 一、创建CDS Table Function 红框内根据自身情况填写 选择 Define Table Function with Parameters 创建 Data Definition 完整…

python项目开发——总结笔记(csv excel读取 服务端端口进程 拟合预测 时间格式转化 服务端程序维护)

目录 部署服务端程序 主服务端控制程序main.py 子目录的计算程序 jisuan.py 读取数据 读取csv数据读取 读取excel 时间格式转换 时间戳转datetime并且生成时间序列最后格式化时间 常用函数 拟合预测 服务端程序控制与维护 部署服务端程序 主服务端控制程序main.py …

ideaSSM社区二手交易平台C2C模式开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 idea ssm 社区二手交易平台系统是一套完善的完整信息管理系统&#xff0c;结合SSM框架完成本系统SpringMVC spring mybatis &#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码…

<支持向量机算法(SVM:Support Vector Machine)>——《机器学习算法初识》

目录 一、⽀持向量机(SVM)算法 1 SVM算法导⼊ 2 SVM算法定义 2.1 定义 2.2 超平⾯最⼤间隔介绍 2.3 硬间隔和软间隔 2.3.1 硬间隔分类 2.3.2 软间隔分类 3 ⼩结 二、 SVM算法api初步使⽤ 三、 SVM算法原理 1 定义输⼊数据 2 线性可分⽀持向量机 3 SVM的计算过程与算…

开源免费CasaOS:轻松打造高效便捷的家庭云生活新体验

一、引言 随着科技的不断发展&#xff0c;家庭云系统逐渐成为现代家庭生活中的重要组成部分。CasaOS作为一款简单易用的开源家庭云系统&#xff0c;受到了广大用户的青睐。其简洁明了的界面设计&#xff0c;使得即使没有任何技术背景的用户也能轻松上手。本文将详细介绍CasaOS…

Helm Chart部署最简SpringBoot到K8S(AWS EKS版)

目标 这里假设&#xff0c;我们已经基本会使用k8s的kubectl命令进行部署了&#xff0c;也已经会自己打docker镜像推送到AWS ECR上面去了。而且&#xff0c;已经在云上准备好了AWS ECR镜像库和AWS EKS的k8s集群了。 这个前提上面&#xff0c;我们今天使用Helm Chart项目准备k8s…

【镜像转存】利用交互式学习平台killercoda转存K8S镜像至Docker私人仓库

文章目录 1. 镜像转存需求2. 注册并登陆 killercoda URL3. 打开playground4. 在线拉取K8S镜像并打上标签5. 推送K8S镜像到Docker私有仓库6. 登陆Docker私有仓库查看 1. 镜像转存需求 因K8S镜像在不开代理的情况下&#xff0c;拉取超时、下载缓慢&#xff0c;导致镜像拉取不下来…

解决无法登录到 ArcGIS Server Administrator

目录 问题复现原因分析解决办法 问题复现 今天在访问arcgisserver后台准备设置arcgis api for js请求路径时&#xff0c;登录之后出现500错误。Services Directoryhttp://xxx.xxx.xxx.xxx:6080/arcgis/admin/system/handlers/rest/servicesdirectory 原因分析 我实在两台虚拟机…

HM v.16.22 顺序读源码day3---TEncTop.cpp

文章目录 TEncTop.cpp引言Void TEncTop::encode执行流程实现细节Class TEncTopVoid TEncTop::xGetNewPicBuffer ( TComPic*& rpcPic, Int ppsId ) TEncTop.cpp 引言 TEncTop类是第二层编码类&#xff0c;也是执行实际编码计算工作的最顶层编码类。 Void TEncTop::encode是…