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

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

姓名:杨馥瑞  学号: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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第五十八回 吴用赚金铃吊挂 宋江闹西岳华山-飞桨图像分割套件PaddleSeg初探

鲁智深被贺太守抓住&#xff0c;押入死牢。武松得信后&#xff0c;正想回梁山报信&#xff0c;正好戴宗来了&#xff0c;就请戴宗赶快回梁山搬救兵。宋江说兄弟有难&#xff0c;怎能不救&#xff1f; 于是带了十六个头领来到少华山。 因为华州城池厚壮&#xff0c;宋江等无计可…

Jmeter+ant,ant安装与配置

1.ant含义 ant&#xff1a;Ant翻译过来是蚂蚁的意思&#xff0c;在我们做接口测试的时候&#xff0c;是可以用来做JMeter接口测试生成测试报告的工具 2.ant下载 下载地址&#xff1a;Apache Ant - Ant Manual Distributions download中选择ant 下载安装最新版zip文件 3.…

【C++面向对象】C++飞机购票订票系统(源码+说明)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

HTML视频笔记

学习arm开发板&#xff0c;涉及到网页HTML PHP什么的&#xff0c;简单看个视频学习下 HTML&#xff5c;超简单HTML入门教程 https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element ​​​​​​vscode需要的libc6等需要的版本高​​​​​​ 为了安装vscode&#xff0c;将…

电商场景下 ES 搜索引擎的稳定性治理实践

继上文在完成了第一阶段 ES 搜索引擎的搭建后&#xff0c;已经能够实现对千万级别的商品索引的读写请求的支持。目前&#xff0c;单机房读流量在 500&#xff5e;1000 QPS 之间&#xff0c;写流量在 500 QPS 左右。 但随着业务的发展&#xff0c;问题也逐渐开始暴露&#xff0…

Qt篇——QChartView获取鼠标停留位置的数值

需求&#xff1a;鼠标停留在QChartView上时&#xff0c;想要计算停留位置的数值。 一开始的方法是想要通过鼠标移动事件计算鼠标在QChartView上的坐标&#xff0c;在换算成数值&#xff0c;后来发现QChartView中除了图表数据&#xff0c;还有坐标轴与坐标轴数值标签占了高度&a…

采购代购系统独立站,接口采集商品上货

采购代购系统独立站的建设与商品上货接口的采集是一个综合性的项目&#xff0c;涉及前端开发、后端开发、数据库设计以及API接口的对接等多个环节。以下是一个大致的步骤和考虑因素&#xff1a; 一、系统规划与需求分析 明确业务需求&#xff1a;确定代购系统的核心功能&…

智能物流新纪元:分布式I/O模块重塑仓储自动化

随着工业4.0概念的深入人心&#xff0c;物流行业正在经历前所未有的变革。在这个过程中&#xff0c;物流企业必须积极走向工业自动化、智能化&#xff0c;进而提高物流效率&#xff0c;降低物流成本&#xff0c;以便更好地满足客户和市场的需求。智能物流、仓库自动化已然是趋势…

SSM整合项目(Vue3环境搭建)

SSM整合项目&#xff08;Vue3环境搭建&#xff09; 1.下载node.js 1.卸载原来的node.js 2.检测是否卸载成功 3.下载node.js&#xff08;10.16.3&#xff09; 一路next就可以 4.检测是否安装成功 2.全局安装Vue插件cli 命令行输入 npm install -g vue/cli 3.新建Vue项目 1.…

惬意上手MongDB

上一篇文章介绍了MySQL&#xff0c;今天来介绍一下MongoDB,相较于MySQL而言&#xff0c;它是简单的。 简介 MongoDB是一种开源的、跨平台的文档数据库&#xff0c;采用NoSQL数据库的形式。它以高性能、高可用性和灵活的数据模型而闻名&#xff0c;适用于大规模数据存储和处理…

html--钢琴

代码 <!DOCTYPE html> <html> <head> <meta http-equiv"Content-Type" content"text/html; charsetutf-8" /> <title>html钢琴</title> <script src"js/js.js"></script> <link href"…

QT开发(二) 构建QMainWindow

1、前言 QMainWindow是Qt框架中用于创建应用程序主窗口的类。它是许多GUI应用程序的基础&#xff0c;提供了丰富的功能和灵活性&#xff0c;以支持用户界面的创建和管理。 QMainWindow的结构主要包括以下几个部分&#xff1a; 菜单栏&#xff08;Menu Bar&#xff09;&#…

【单调栈】代码随想录算法训练营第六十天 |84.柱状图中最大的矩形(待补充)

84.柱状图中最大的矩形 1、题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 2、文章讲解&#xff1a;代码随想录 3、题目&#xff1a; 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱…

RC4算法:流密码算法的经典之作

title: RC4算法&#xff1a;流密码算法的经典之作 date: 2024/3/11 18:16:16 updated: 2024/3/11 18:16:16 tags: RC4起源演变算法优劣分析RC4 vs AES安全性RC4 vs DES性能比较应用场景介绍工作原理详解代码实例演示 一、RC4算法的起源与演变 RC4算法是由著名密码学家Ron Riv…

粒子群算法对pi控制器进行参数优化,随时优化pi参数以控制直流无刷电机转速。

粒子群算法对pi控制器进行参数优化&#xff0c;随时优化pi参数以取得设定直流无刷电机转速。 PSO优化PID&#xff0c;用于BLDC速度控制 仿真平台为&#xff1a;MATLAB 采用的是Simulinkm程序相配合 仿真结果以及程序示例&#xff1a;

UnityShader常用算法笔记(颜色叠加混合、RGB-HSV-HSL的转换、重映射、UV序列帧动画采样等,持续更新中)

一.颜色叠加混合 1.Blend混合 // 正常&#xff0c;透明度混合 Normal Blend SrcAlpha OneMinusSrcAlpha //柔和叠加 Soft Additive Blend OneMinusDstColor One //正片叠底 相乘 Multiply Blend DstColor Zero //两倍叠加 相加 2x Multiply Blend DstColor SrcColor //变暗…

一款前端开发工具Hbuilder

背景&#xff1a;最近日在接触前同事留下的一个VUE项目&#xff08;只有前端代码&#xff0c;后台服务压根没写真不知道以前是怎么糊弄过去的&#xff09;时&#xff0c;发现一款可以快速开发前端的软件&#xff1b;今日分享一下。 当我打开项目时发现&#xff0c;有个app.vue…

C语言——详解字符函数和字符串函数(一)

Hi,铁子们好呀&#xff01;今天博主来给大家更一篇C语言的字符函数和字符串函数~ 具体讲的内容如下&#xff1a; 文章目录 &#x1f386;1.字符分类函数&#x1f4af;&#x1f4af;⏩1.1 什么是字符分类函数的&#xff1f;&#x1f4af;&#x1f4af;⏩1.2 字符函数的类型有哪…

回归预测 | Matlab实现GSWOA-KELM混合策略改进的鲸鱼优化算法优化核极限学习机的数据回归预测

回归预测 | Matlab实现GSWOA-KELM混合策略改进的鲸鱼优化算法优化核极限学习机的数据回归预测 目录 回归预测 | Matlab实现GSWOA-KELM混合策略改进的鲸鱼优化算法优化核极限学习机的数据回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 GSWOA-KELM多变量回归预测…

ffmpeg解码和渲染理解

ffmpeg解码和渲染理解 ffmpeg视频解码步骤 FFmpeg 是一个功能强大的跨平台多媒体处理工具&#xff0c;包含了音视频编解码、封装/解封装、过滤器等功能。下面是一般情况下使用 FFmpeg 进行视频解码的步骤&#xff1a; 初始化 FFmpeg 库&#xff1a;首先需要初始化 FFmpeg 库&a…