数据结构与算法 第二次实验报告堆栈队列

简介:   数据结构与算法第二次实验报告      姓名:许恺学号:2014011329班级:计算机14-1             中国石油大学(北京)计算机科学与技术系  前     言    《数据结构》是计算机及相关专业的一门核心基础课程,也是很多高校考研专业课之一。

 

 

 

数据结构与算法

第二次实验报告

 

 

 

 

 

 

姓名:许恺

学号:2014011329

班级:计算机14-1

 

 

 

 

 

 

 

 

 

 

 

 

 

中国石油大学(北京)计算机科学与技术系

 

 

    

    《数据结构》是计算机及相关专业的一门核心基础课程,也是很多高校考研专业课之一。它主要介绍线性结构、树结构、图结构三种逻辑结构元素的存储实现,在此基础上介绍一些典型算法及时、空效率分析。这门课程的主要任务是培养学生的算法设计能力及良好的程序设计习惯。通过学习,要求学生能够掌握典型算法的设计思想及程序实现,能够根据实际问题选取合适的存储方案,设计出简洁、高效、实用的算法,为后续课程的学习及软件开发打下良好的基础。学习这门课程,习题和实验是两个关键环节。学生理解算法,上机实验是最佳的途径之一。因此,实验环节的好坏是学生能否学好《数据结构》的关键。为了更好地配合学生实验,特编写实验指导书。

一、实验目的

    更好的理解算法的思想、培养编程能力。

二、实验要求

1、每次实验前学生必须根据试验内容认真准备实验程序及调试时所需的输入数据。

     2、在指导教师的帮助下能够完成实验内容,得出正确的实验结果。

     3、实验结束后总结实验内容、书写实验报告。

 4、遵守实验室规章制度、不缺席、按时上、下机。

     5、实验学时内必须做数据结构的有关内容,不允许上网聊天或玩游戏,如发现上述现象,取消本次上机资格,平时成绩扣 10 分。

     6、实验报告有一次不合格,扣 5 分,两次以上不合格者,平时成绩以零分记。

三、实验环境  VC++6.0 或者 VC2010

四、说明

     1、本实验的所有算法中元素类型可以根据实际需要选择。

     2、实验题目中带*者为较高要求,学生可自选;其余部分为基本内容,应尽量完成(至少完成 70%,否则实验不合格)。

     3、数据结构是很多高校的硕士研究生入学考试的专业课之一,希望有志于考研的学生能够在学习过程中注意各种算法的理解,以便为考研做一定的准备。

五、实验报告的书写要求    

  1.明确实验的目的及要求;    

  2.记录实验的输入数据和输出结果;    

  3.说明实验中出现的问题和解决过程;    

  4.写出实验的体会和实验过程中没能解决的问题;

六、参考书目《数据结构》(C++语言描述) 王红梅等 清华大学出版社DATA STRUCTURE WITH C++William Ford,William Topp 清华大学出版社(影印版)

实验二 栈、队列、串的操作

实验类型:验证性  

实验要求:必修

实验学时: 2 学时

一、实验目的:

参照给定的栈类和队列类的程序样例,验证给出的栈和队列的常见算法,并结合线性表

类实现有关串的操作。

二、实验要求:

1、掌握栈、队列、串的特点。掌握特殊线性表的常见算法。

2、提交实验报告,报告内容包括:目的、要求、算法描述、程序结构、主要变量说明、程序清单、调试情况、设计技巧、心得体会。

三、实验内容:

     1. 堆栈类测试和应用问题。要求:

       (1)设计一个主函数实现对顺序堆栈类和链式堆栈类代码进行测试。测试方法为:依次把数据元素 1,2,3,4,5 入栈,然后出栈堆栈中的数据元素并在屏幕上显示。

       (2)定义数据元素的数据类型为如下形式的结构体:

typedef  struct

{  char taskname[10];//任务名

   int taskno;    //任务号

            DataType

              设计一个包含 5 个数据元素的测试数据,并设计一个主函数实现依次把 5个数据元素入栈,然后出栈堆栈中的数据元素并在屏幕上显示。

2. 队列类测试和应用问题。要求:

              设计一个主函数对循环队列类和链式队列类代码进行测试.测试方法为:依次把数据元素 1,2,3,4,5 入队,然后出队中的数据元素并在屏幕上显示。

3.设计串采用顺序存储结构,编写函数实现两个串的比较 Compare(S, T)。要求比较结果有大于、等于和小于三种情况。

    *4. 设计算法利用栈类实现把十进制整数转换为二至九进制之间的任一进制输出。

  *5. 设计串采用静态数组存储结构,编写函数实现串的替换 Replace(S, start, T, V)即要求在主串 S 中,从位置 start 开始查找是否存在子串 T,若主串 S 中存在子串T,则用子串 V 替换子串 T,且函数返回 1;若主串 S 中不存在子串 T,则函数返回0。并要求设计主函数进行测试。一个测试例子为:S=”I am a student”,T=student”,V=teacher “。

四、实验操作计划  

实验第一部分(25 分钟) :

源代码

1.LinkStackMain.cpp文件

#include <iostream> 

using namespace std;

#include "LinkStack.h" 

void main( )

{

LinkStack<int>a;

if (a.Empty( ))

{

cout<<"栈空,执行操作"<<endl;

cout<<"10 进行压栈操作:"<<endl;

try

{

a.Push(10);

}

catch(char* wrong)

{

cout<<wrong;

}

cout<<"读取栈顶元素:"<<endl;

cout<<a.GetTop( )<<endl;

cout<<"15 栈进行压栈操作:"<<endl;

try

{

  a.Push(15);

}

catch(char* wrong)

{

  cout<<wrong;

}

cout<<"读取栈顶元素:\n";

cout<<a.GetTop( )<<endl;

cout<<"进行出栈操作:"<<endl;

a.Pop( );

cout<<"读取栈顶元素:"<<endl;

cout<<a.GetTop( )<<endl;

}

else{

  cout<<"栈不空"<<endl;

}

//a.~LinkStack( );

}

2.LinkStack.h文件

#ifndef LINKSTACK_H

#define LINKSTACK_H

template <class T>

struct Node

{

T data;

Node<T> *next;

};

template <class T>

class LinkStack

{

  public:

LinkStack( );

~LinkStack( );

void Push(T x);

T Pop( );

bool Empty( );

T GetTop( );

  private:

Node<T> *top;

Node<T> *head;

};

template <class T>

LinkStack<T>::LinkStack( )

{

head=new Node<T>;

head->next=NULL;

top = head->next;

}

template <class T>

LinkStack<T>::~LinkStack()

{

Node <T> *p=head;

Node <T> *q;

while(p)

{

q=p;

p=p->next;

delete q;

}

delete p;

}

template<class T>

void LinkStack<T>::Push(T x)

{

Node<T> *p;

p=new Node<T>;

p->data=x;

p->next=NULL;

if(top==NULL)

{

  top=p;

  head->next = p;

}

else

{

  top->next=p;

  top=p;

}

}

template <class T> T LinkStack<T>::Pop( )

{

T x;

Node<T> *p= head;

if (top==head) throw "下溢";

while(p->next!=top)

  p=p->next;

x=p->data;

top=p;

return x;

}

template <class T>

T LinkStack<T>::GetTop( )

{

if (top!=NULL)

  return top->data;

else return NULL;

}

template <class T>

bool LinkStack<T>::Empty( )

{

if(top==NULL)

  return 1;

else

  return 0;

}  

#endif;

3.SeqStackMain.cpp文件

/*#include <iostream>

using namespace std;

#include "SeqStack.h"

void main()

{

SeqStack<int> a;

if (a.Empty( ))

{

cout<<"栈空,执行入栈操作:"<<endl;

cout<<"15 10 执行入栈操作:"<<endl;

try

{

  a.Push(15);

  a.Push(10);

}

catch(char* wrong)

{

  cout<< wrong;

}

cout<<"栈顶元素为:"<<endl;

cout<<a.GetTop( )<<endl;

cout<<"执行出栈操作:"<<endl;

cout<<a.Pop( )<<endl;

cout<<"栈顶元素为:"<<endl;

cout<<a.GetTop( )<<endl;

}

else{

  cout<<"栈不空"<<endl;

}

}*/

4.SeqStack.h文件

#ifndef SEQSTACK_H

#define SEQSTACK_H

const int StackSize=10;

template <class T>

class SeqStack

{

  public:

SeqStack( ) ;

~SeqStack( );

void Push(T x);

T Pop( );

T GetTop( );

bool Empty( );

  private:

T data[StackSize];

int top;

};

template <class T>

SeqStack<T>::SeqStack( )

{

  top=-1;

}

template <class T>

SeqStack<T>::~SeqStack( )

{

 

}

template <class T>

void SeqStack<T>::Push(T x)

{

if (top== StackSize-1) throw "上溢";

  top++;

data[top]=x;

}

template <class T>

T SeqStack<T>::Pop( )

{

T x;

if (top==-1) throw "下溢";

x=data[top--];

return x;

}

template <class T>

T SeqStack<T>::GetTop( )

{

if (top!=-1)

  return data[top];

}

template <class T>

bool SeqStack<T>::Empty( )

{

  if(top==-1) return 1;

  else return 0;

}

#endif

运行程序贴图

 

 

三.报告总结:

   报告并不难,只是连老师给的代码太考验我们了,我知道可能是老师故意设的陷阱,也费了不少时间修改原来的代码。主要问题出在了析构函数的使用,其实程序结束会自动调用的,但是,我却又调了一遍,导致报错。嗯,就这些。

 

 

(真是后悔当时怎么没有多写点注释和报告总结,可是现在让我写现在的总结同样还是不会写的很详细,人类真的是很烦的物种。。。)

相关文章
|
1月前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
163 9
|
26天前
|
存储 算法 编译器
数据结构实验之矩阵的运算器(二维数组)
本实验旨在通过团队合作,掌握数组和矩阵相关运算的代码实现,包括矩阵的加减、数乘、转置、乘法、n次方及行列式的计算。实验过程中,成员们需分工协作,解决编程难题,最终实现一个功能完备的矩阵计算器。通过本实验,不仅锻炼了编程能力,还加深了对数学概念的理解,同时培养了团队合作精神。
49 4
|
26天前
数据结构实验之串模式匹配问题
本实验旨在掌握串模式匹配技术,通过创建文本文件、实现单词计数与定位功能,最终构建一个包含文件建立、单词统计与定位、程序退出等选项的主菜单,以增强对字符串处理的理解与应用能力。
40 4
|
26天前
|
算法
数据结构实验之最长公共子序列
本实验旨在通过编程实践帮助学生理解串的基本概念及求解最长公共子序列的算法。实验内容包括使用动态规划方法设计并实现算法,以找出给定两序列的最大公共子序列。示例代码展示了如何通过构建状态矩阵和回溯路径来找到解决方案。实验总结指出,`memset()`函数用于内存初始化,且对于特定输入,程序能正确输出最长公共子序列之一。
49 4
|
26天前
|
算法
数据结构实验之操作系统打印机管理器问题
本实验旨在通过实现操作系统中的打印机管理器问题,掌握队列的基本操作如入队、出队等,利用队列的先进先出特性解决先申请先打印的问题。实验包括队列的初始化、入队、出队、打印队列内容等功能,并通过菜单式界面进行交互。实验结果显示基本功能可正常执行,但在连续操作时存在执行失败的情况,需进一步优化。
37 4
|
26天前
|
存储 算法 Perl
数据结构实验之链表
本实验旨在掌握线性表中元素的前驱、后续概念及链表的建立、插入、删除等算法,并分析时间复杂度,理解链表特点。实验内容包括循环链表应用(约瑟夫回环问题)、删除单链表中重复节点及双向循环链表的设计与实现。通过编程实践,加深对链表数据结构的理解和应用能力。
52 4
|
19天前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
42 5
|
26天前
|
机器学习/深度学习 存储 算法
数据结构实验之二叉树实验基础
本实验旨在掌握二叉树的基本特性和遍历算法,包括先序、中序、后序的递归与非递归遍历方法。通过编程实践,加深对二叉树结构的理解,学习如何计算二叉树的深度、叶子节点数等属性。实验内容涉及创建二叉树、实现各种遍历算法及求解特定节点数量。
75 4
|
26天前
|
存储 人工智能 算法
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
48 4
|
1月前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之栈和队列精题汇总(10)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第3章之IKUN和I原达人之数据结构与算法系列学习栈与队列精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!