北科大_ 数据结构上机实验报告

合集下载

上机实验报告简书(3篇)

上机实验报告简书(3篇)

第1篇一、实验目的本次实验旨在通过实际操作,掌握以下技能:1. 熟悉实验环境及实验设备的使用;2. 理解并应用所学理论知识,解决实际问题;3. 提高动手能力和团队协作能力。

二、实验环境1. 操作系统:Windows 102. 编程语言:Python3.73. 实验软件:PyCharm4. 实验设备:计算机三、实验内容本次实验主要分为以下几个部分:1. 数据结构实验2. 算法设计实验3. 项目实践1. 数据结构实验实验内容(1)实现链表的基本操作:创建、插入、删除、查找等。

(2)实现栈和队列的基本操作:入栈、出栈、入队、出队等。

(3)实现散列表的基本操作:创建、插入、删除、查找等。

实验步骤(1)创建一个单链表,并实现其基本操作。

(2)创建一个栈,并实现其基本操作。

(3)创建一个队列,并实现其基本操作。

(4)创建一个散列表,并实现其基本操作。

2. 算法设计实验实验内容(1)实现冒泡排序、选择排序、插入排序等基本排序算法。

(2)实现快速排序、归并排序等高级排序算法。

(3)实现二分查找算法。

实验步骤(1)编写冒泡排序、选择排序、插入排序等基本排序算法的代码。

(2)编写快速排序、归并排序等高级排序算法的代码。

(3)编写二分查找算法的代码。

3. 项目实践实验内容设计并实现一个简单的学生管理系统,包括以下功能:(1)学生信息录入:包括学号、姓名、性别、年龄、班级等。

(2)学生信息查询:根据学号或姓名查询学生信息。

(3)学生信息修改:修改学生信息。

(4)学生信息删除:删除学生信息。

实验步骤(1)设计学生管理系统的数据结构。

(2)编写学生信息录入、查询、修改、删除等功能的代码。

(3)编写主函数,实现学生管理系统的运行。

四、实验结果与分析1. 数据结构实验结果与分析通过本次实验,我们掌握了链表、栈、队列和散列表的基本操作,并能够根据实际需求选择合适的数据结构。

2. 算法设计实验结果与分析通过本次实验,我们熟悉了基本排序算法和高级排序算法,以及二分查找算法。

《数据结构》实验报告

《数据结构》实验报告

《数据结构》实验报告目录一、实验概述 (2)二、实验原理 (2)2.1 数据结构基本概念 (3)2.2 选择的数据结构类型 (4)2.3 实验原理说明 (5)三、实验步骤 (6)3.1 实验准备 (7)3.2 数据结构选择与实现 (7)3.2.1 数据结构类型选择 (9)3.2.2 数据结构实现细节 (9)3.3 实验功能实现 (10)3.3.1 功能一 (11)3.3.2 功能二 (12)四、实验结果与分析 (13)4.1 实验数据 (15)4.2 结果展示 (16)4.2.1 结果一展示 (17)4.2.2 结果二展示 (17)4.3 结果分析 (18)4.3.1 结果一分析 (19)4.3.2 结果二分析 (20)五、实验总结与讨论 (22)5.1 实验总结 (23)5.2 实验中遇到的问题及解决方法 (24)5.3 对数据结构的认识与体会 (25)5.4 对实验教学的建议 (27)一、实验概述本次实验旨在通过实际操作,加深对《数据结构》课程中所学理论知识的理解和掌握。

实验内容围绕数据结构的基本概念、常用算法以及在实际应用中的实现进行设计。

通过本次实验,学生将能够:理解并掌握线性表、栈、队列、链表、树、图等基本数据结构的特点和适用场景。

掌握常用的数据结构操作算法,如插入、删除、查找等,并能够运用这些算法解决实际问题。

学习使用C++、或其他编程语言实现数据结构的操作,提高编程能力和算法设计能力。

本次实验报告将对实验的目的、内容、步骤、结果及分析等方面进行详细阐述,旨在通过实验过程的学习,提高学生对数据结构理论知识的理解和应用能力。

二、实验原理数据结构的基本概念:介绍数据结构的基本定义,包括数据元素、数据集合、数据关系等基本概念,以及数据结构的三要素:逻辑结构、存储结构和运算。

栈和队列:介绍栈和队列的定义、特点、基本运算及其在算法设计中的重要性。

树和二叉树:讲解树的基本概念、二叉树的结构特点、遍历方法、二叉搜索树及其在数据检索中的应用。

数据结构上机实验报告

数据结构上机实验报告
{if(i%2==0) insert(lb,i/2,la.list[i]); //奇数位次元诩插入lb
else insert(lc,i/2,la.list[i]); //偶数位次元素插入lc
}
printf("\n您输入的线性表元素为:\n\n");
print(la);
printf("线性表的奇数位次的元素为:\n\n");
print(lb);
printf("线性表的偶数位次的元素为:\n\n");
print(lc);
}
void initial(sqlist &v)
{printf(" ****本程序可以实现线性表奇偶位序的元素分别输出****\n\n\n");
int i,a;
printf("请输入一个偶数作为线性表的长度:\n\n");
void initlist(sqlist &);
void print(sqlist); //输出线性表
void main()
{printf(" *****************本程序可以实现线性表的复制******************\n");
sqlist la,lb; //声明线性表
initial(la);
【程序设计细想】:
建立三个线性表la,lb,lc,对线性表la进行输入,然后利用循环结构对la中奇数位序的元素对lb进行插入操作,对偶数位序的元素对lc进行插入操作,从而得到线性表lb和lc。
【程序代码】:
#include<stdio.h>
#include<malloc.h>

数据结构上机操作实验报告

数据结构上机操作实验报告

实验一单链表的基本操作(必做)一、实验目的1.掌握单链表的存储、初始化、插入、删除等操作的程序实现。

2.加深对单链表基本概念,基本理论及相应算法的掌握与理解。

3.了解链表的处理方式,学习体会简单的单链表程序实现相关知识。

二、实验内容1.建立一个链表、设计链表的基本操作实现算法、输出一个链表表,调试并输出结果。

2.编写一个程序实现如下功能:让计算机产生出50个0~9之间的随机数并依次保存到单链表中;输出遍历单链表;从单链表中删除与给定值相等的所有结点;输出遍历单链表;输出单链表长度,调试并输出结果。

三、实验步骤1.定义一个链表结构体。

2.利用插入功能插入一个结点。

3.利用删除功能删除一个结点。

四、程序运行测试1.利用插入功能插入一个结点。

2.利用删除功能删除一个结点。

五、实验报告要求1.绘制链表操作实现的流程图。

2.详细给出程序运行测试结果(包括测试数据和测试结果)。

3.选试验步骤2-3中的任意一个,给出程序的详细注释。

4.参考程序中某一部分功能的改进(选做)5.实验心得与体会6.附录,实验用源程序六、参考源代码#include <iostream.h>#include <malloc.h>typedef struct LNode{int data;struct LNode *next;}Lnode, *LinkList;//假设下面的单链表均为带头结点。

void CreatLinkList(LinkList &L,int j){//建立一个单链表L,数据为整数,数据由键盘随机输入。

LinkList p,q;L=(LinkList )malloc(sizeof(Lnode));L->next=NULL;q=L;cout<<"在单链表内输入整数:"<<endl;for(int i=0;i<j;i++) p=(LinkList)malloc(sizeof(Lnode)); cin>>p->data;p->next=q->next;q->next=p;q=p; }int PrintLinkList(LinkList &L){//输出单链表L的数据元素LinkList p;p=L->next;if(L->next==NULL){cout<<"链表没有元素!"<<endl;return 0;}cout<<"单链表的数据元素为:";while(p){cout<<p->data<<" ";p=p->next;}cout<<endl;return 1;}void LinkListLengh(LinkList &L){//计算单链表L的数据元素个数。

数据结构上机实验报告

数据结构上机实验报告

数据结构上机实验报告学院:电子工程学院专业:信息对抗技术姓名:学号:教师:饶鲜日期:目录实验一线性表 ........................................................................................................ - 4 -一、实验目的.................................................................................................... - 4 -二、实验代码.................................................................................................... - 4 -三、实验结果.................................................................................................. - 14 -四、个人思路.................................................................................................. - 15 - 实验二栈和队列 .................................................................................................. - 15 -一、实验目的.................................................................................................. - 15 -二、实验代码.................................................................................................. - 16 -三、实验结果.................................................................................................. - 24 -四、个人思路.................................................................................................. - 25 - 实验三数组 .......................................................................................................... - 26 -一、实验目的.................................................................................................. - 26 -二、实验代码.................................................................................................. - 26 -三、实验结果.................................................................................................. - 28 -四、个人思路.................................................................................................. - 28 - 实验四树 .............................................................................................................. - 29 -一、实验目的.................................................................................................. - 29 -二、实验代码.................................................................................................. - 29 -三、实验结果.................................................................................................. - 39 -四、个人思路.................................................................................................. - 39 -实验一线性表一、实验目的1.熟悉线性表的顺序和链式存储结构2.掌握线性表的基本运算3.能够利用线性表的基本运算完成线性表应用的运算二、实验代码1.设有一个线性表E={e1, e2, … , e n-1, e n},设计一个算法,将线性表逆置,即使元素排列次序颠倒过来,成为逆线性表E’={ e n, e n-1 , … , e2 , e1 },要求逆线性表占用原线性表空间,并且用顺序表和单链表两种方法表示,分别用两个程序来完成。

数据结构上机实习报告

数据结构上机实习报告

上机实习报告班号:116112姓名:**学号:***********实习报告【实习一】线性表及其应用n(n>20)的阶乘【问题描述】大数运算——计算n的阶乘(n>=20)。

【基本要求】(1)数据的表示和存储:(1.1)累积运算的中间结果和最终的计算结果的数据类型要求是整型——这是问题本身的要求;(1.2)试设计合适的存储结构,要求每个元素或结点最多存储数据的3位数值。

(2)数据的操作及其实现:基于设计的存储结构实现乘法操作,要求从键盘上输入n值,在屏幕上显示最终计算结果。

【问题分析】(1)设计数据的存储结构:介于乘运算的精确性以及实型数据表示的不精确性,本题不能采用实型表示累积运算的中间结果和最终的计算结果,而只能用整型。

然而由于普通整型和长整型所能表述数的范围受其字长的限制,不能表示大数阶乘的累积结果,故必须设计一个合适的数据结构实现对数据的存储,例如可以让每个元素或结点存储数据的若干位数值。

从问题描述不难看出n值为任意值,故为使程序尽量不受限制,应采用动态存储结构。

累积运算的特点是当前的计算结果是下次乘法运算的乘数。

实现两个数的乘法运算须考虑:(1)乘数的各位数都要与被乘数进行乘法运算;(2)乘法过程中的进位问题及其实现;(3)因每个元素或结点最多存储数据的3位数值,故当元素或结点中的数值大于999,需向前一个元素或结点进位。

综合以上几点,我采用了单链表的储存结构形式。

(2)阶乘算法的实现:1. 链表型数据乘法的具体实现描述:(1)初始算法顺序访问对每个节点上的数据乘以要乘的数后在顺序访问查看是否需要进位,大于999则向前进位,如果前面没有节点则添加新节点储存进位的数(2)改进算法将原始算法的乘操作和进位操作合在一起进行,提高程序效率.2. 数据输出算法具体实现描述从高位向低位顺序输出节点上储存的数据,注意补零,最高位的节点不补,其它节点要补。

对于最后的结果,因为我采用的是普通的单链表算法,因此我添加了一个逆置的算法。

数据结构上机实验报告

数据结构上机实验报告

数据结构上机实验报告数据结构上机实验报告1. 实验目的数据结构是计算机科学中非常重要的一门课程,通过本次上机实验,旨在帮助学生巩固和应用所学的数据结构知识,培养学生分析和解决实际问题的能力。

2. 实验背景本次实验涉及到两个常用的数据结构:栈和队列。

栈是一种后进先出(Last In First Out,LIFO)的数据结构,而队列是一种先进先出(First In First Out,FIFO)的数据结构。

通过实验,我们将学习如何使用这两种数据结构来解决实际问题。

3. 实验内容本次实验分为两个部分:栈的应用和队列的应用。

3.1 栈的应用在栈的应用部分,我们将实现一个简单的括号匹配算法。

该算法可以判断一个字符串中的括号是否匹配。

具体实现步骤如下:3.1.1 创建一个栈来存储括号字符;3.1.2 遍历字符串中的每个字符;3.1.3 如果遇到左括号,则将其入栈;3.1.4 如果遇到右括号,则判断栈顶元素是否是对应的左括号;3.1.5 如果栈为空或栈顶元素不是对应的左括号,则括号不匹配;3.1.6 如果栈顶元素是对应的左括号,则将其出栈;3.1.7 遍历完字符串后,如果栈为空,则括号匹配,否则括号不匹配。

通过实现这个算法,我们可以学习到如何使用栈来解决实际问题,并且理解栈的后进先出的特性。

3.2 队列的应用在队列的应用部分,我们将实现一个简单的任务调度算法。

该算法可以模拟多个任务按照一定的优先级进行调度的过程。

具体实现步骤如下:3.2.1 创建一个队列来存储任务;3.2.2 每个任务包含两个属性:任务名称和优先级;3.2.3 向队列中添加任务,并按照优先级进行排序;3.2.4 从队列中取出优先级最高的任务,并执行;3.2.5 执行完任务后,继续从队列中取出下一个优先级最高的任务,并执行,直到队列为空。

通过实现这个算法,我们可以学习到如何使用队列来实现任务调度,并且理解队列的先进先出的特性。

4. 实验结果与分析通过实验,我们成功实现了括号匹配算法和任务调度算法,并得到了正确的结果。

《数据结构》实验报告一

《数据结构》实验报告一

《数据结构》实验报告一数据结构实验报告一引言:数据结构是计算机科学中非常重要的一门课程,它研究数据的组织方式和操作方法,为解决实际问题提供了基础。

本实验报告将介绍我在学习《数据结构》课程中进行的第一次实验,主要涉及线性表的顺序存储结构和链式存储结构的实现与比较。

一、实验目的本次实验的目的是通过编写代码实现线性表的顺序存储结构和链式存储结构,并对两种存储结构进行比较,分析它们的优缺点。

二、实验内容1. 线性表的顺序存储结构实现顺序存储结构是将线性表的元素按照其逻辑次序依次存放在一组连续的存储单元中。

我通过定义一个具有固定大小的数组,利用数组下标来表示元素的逻辑次序,实现了线性表的顺序存储结构。

2. 线性表的链式存储结构实现链式存储结构是通过指针将线性表的元素存储在不连续的存储单元中,每个元素包含一个数据域和一个指针域,指针域指向下一个元素。

我定义了一个节点结构体,通过创建节点之间的指针关系,实现了线性表的链式存储结构。

三、实验结果与分析1. 顺序存储结构的优点:a. 存储密度高,不需要额外的指针域,节省存储空间;b. 随机访问元素方便,时间复杂度为O(1)。

2. 顺序存储结构的缺点:a. 插入和删除元素时需要移动其他元素,时间复杂度为O(n);b. 存储空间固定,容量不易扩展。

3. 链式存储结构的优点:a. 插入和删除元素时只需改变指针域,时间复杂度为O(1);b. 存储空间可以动态分配,容量易于扩展。

4. 链式存储结构的缺点:a. 存储密度低,需要额外的指针域,占用更多的存储空间;b. 随机访问元素不方便,时间复杂度为O(n)。

通过对比分析,我们可以根据实际需求选择适合的存储结构。

如果需要频繁进行插入和删除操作,链式存储结构更为合适;如果需要频繁进行随机访问操作,顺序存储结构更为合适。

四、实验总结通过本次实验,我深入理解了线性表的顺序存储结构和链式存储结构的实现原理和优缺点。

在实际编程中,根据不同的需求选择合适的存储结构非常重要。

北工大数据结构上机实验报告1

北工大数据结构上机实验报告1

实验一报告姓名:学号:完成日期: 2015年4月7日1、题目: 设有n个人坐在一个圆桌周围, 现从第s个人开始报数, 数到第m的人出列, 然后从出列的下一个人重新开始报数, 数到第m的人又出列, 如此反复直到所有的人全部出列为止。

Josephus问题是: 对于任意给定的n、s、m, 求出按出列次序得到的n个人员的序列。

试在计算机上模拟Josephus问题的求解工程。

2、需求分析输入形式、输入值的范围: 输入的值必须为正整数输出形式: 输出为一组正整数程序功能:对于任意给定的n、s、m, 求出按出列次序得到的n个人员的序列。

测试数据: 正确的输入: 6 3 2正确的输出: 4 6 2 5 3 1错误的输入: 6 3 23、错误的输出: 1 2 3 4 5 64、概要设计主程序流程:否是5、 调试分析 调试中并遇到的问题: 运行结果少一个数解决方案:在while 循环的限制条件中, 是循环次数加16、算法时空分析: O(n) 7、用户使用说明 8、 运行程序后, 用户按照提示顺序输入3个正整数, 然后按回车可得到结果9、 测试结果输入: 6 3 210、 输出: 4 6 2 5 3 111、 源程序以顺序表实现:#include<iostream>using namespace std;void JJ(int n,int s,int m){int *a=new int [10000];int i;int count=0;int t=0;for(i=0;i<n;i++){a[i]=i+1;}i=s-1;cout<<"出列次序为: ";while(count<n-1){if(a[i]!=0)t++;if(t==m){t=0;//记数归cout<<a[i]<<" ";//依次输出删除的编号a[i]=0;//给删除的数组赋0count++;//退出人数加1}i++;if(i==n)i=0;//报数到末尾后i恢复为0}cout<<endl;}void main(){int n,s,m;cout<<"请输入总人数:"<<endl;cin>>n;cout<<"请输入开始报数的人员序号:"<<endl;cin>>s;cout<<"请输入出列人员的序号:"<<endl;cin>>m;JJ(n,s,m);}以链表实现:#include<iostream>using namespace std;typedef struct LNode{int data;struct LNode *next;}LNode,*LinkList;void JJ(int n,int s,int m){LinkList p,r,list=NULL;int i;//建立一个循环链表for(i=0;i<n;i++){p=(LinkList)malloc(sizeof(LNode));p->data=i+1; //存放第i个结点的编号if(list==NULL)list=p;elser->next=p;r=p;}p->next=list;p=list;for(i=1;i<s;i++){r=p;//当m!=1,但s=1时如果没有这条语句, 此时删除动作无法完成p=p->next;}//此时p指向第1个出发结点cout<<"出列次序为: ";while(p->next!=p){for(i=1;i<m;i++){r=p;p=p->next;} //p指向第m个结点,r指向第m-1个结点r->next=p->next; //删除第m个结点cout<<p->data<<" ";delete p;p=r->next;}cout<<p->data;cout<<endl;}void main(){int n,s,m;cout<<"请输入总人数:"<<endl;scanf("%d",&n);cout<<"请输入开始报数的人员序号:"<<endl;scanf("%d",&s);cout<<"请输入出列人员的序号:"<<endl;scanf("%d",&m);JJ(n,s,m);}。

数据结构上机实验报告

数据结构上机实验报告

实验名称:数据结构实验实验时间:2021年X月X日实验地点:计算机实验室实验目的:1. 理解并掌握基本数据结构(线性表、栈、队列、链表、树、图)的概念和操作。

2. 能够运用C语言实现基本数据结构的各种操作。

3. 培养编程能力和问题解决能力。

实验内容:1. 线性表2. 栈3. 队列4. 链表5. 树6. 图实验环境:1. 操作系统:Windows 102. 编程语言:C语言3. 开发环境:Visual Studio 2019实验步骤:一、线性表1. 实现线性表的创建、插入、删除、查找和遍历等基本操作。

2. 编写代码,实现以下功能:- 创建一个线性表,包含10个元素。

- 在第3个位置插入一个新元素。

- 删除第5个位置的元素。

- 查找线性表中的第7个元素。

- 遍历线性表,并打印所有元素。

二、栈1. 实现栈的创建、入栈、出栈、判空和求栈顶元素等基本操作。

2. 编写代码,实现以下功能:- 创建一个栈。

- 向栈中依次入栈元素1、2、3、4、5。

- 判断栈是否为空。

- 求栈顶元素。

- 出栈元素,并打印出栈的元素。

三、队列1. 实现队列的创建、入队、出队、判空和求队头元素等基本操作。

2. 编写代码,实现以下功能:- 创建一个队列。

- 向队列中依次入队元素1、2、3、4、5。

- 判断队列是否为空。

- 求队头元素。

- 出队元素,并打印出队的元素。

四、链表1. 实现单链表、双向链表和循环链表的创建、插入、删除、查找和遍历等基本操作。

2. 编写代码,实现以下功能:- 创建一个单链表,包含元素1、2、3、4、5。

- 在第2个位置插入一个新元素。

- 删除第3个位置的元素。

- 查找链表中的第4个元素。

- 遍历链表,并打印所有元素。

五、树1. 实现二叉树的创建、插入、删除、查找和遍历等基本操作。

2. 编写代码,实现以下功能:- 创建一个二叉树,包含元素1、2、3、4、5。

- 在第2个位置插入一个新元素。

- 删除第3个位置的元素。

数据结构上机实验报告

数据结构上机实验报告

数据结构上机实验报告一、实验目的本次数据结构上机实验的主要目的是通过实际编程操作,深入理解和掌握常见的数据结构及其基本操作,提高解决实际问题的能力和编程技能。

具体目标包括:1、熟练掌握线性表、栈、队列、树、图等数据结构的基本概念和存储方式。

2、学会运用数据结构的相关算法进行数据的插入、删除、查找、排序等操作。

3、培养分析问题、设计算法、编写代码和调试程序的综合能力。

4、增强对数据结构在实际应用中的认识,提高解决复杂问题的思维能力。

二、实验环境1、操作系统:Windows 102、编程环境:Visual Studio 20193、编程语言:C++三、实验内容本次实验共包括以下几个部分:1、线性表的操作实现顺序表和链表的创建、插入、删除、查找和遍历操作。

比较顺序表和链表在不同操作下的性能差异。

2、栈和队列的应用利用栈实现表达式求值。

用队列模拟银行排队系统。

3、树的遍历实现二叉树的先序、中序和后序遍历算法,并输出遍历结果。

构建哈夫曼树,并进行编码和解码操作。

4、图的基本操作用邻接矩阵和邻接表存储图,并实现图的深度优先搜索和广度优先搜索算法。

四、实验步骤及结果1、线性表的操作顺序表的实现:```cppinclude <iostream>using namespace std;define MAXSIZE 100 //顺序表的最大长度class SeqList {private:int dataMAXSIZE; //存储顺序表元素的数组int length; //顺序表的当前长度public:SeqList(){//构造函数,初始化顺序表length = 0;}//插入元素bool insert(int pos, int element) {if (pos < 0 || pos > length || length == MAXSIZE) {return false;}for (int i = length; i > pos; i) {datai = datai 1;}datapos = element;length++;return true;}//删除元素bool remove(int pos) {if (pos < 0 || pos >= length) {return false;}for (int i = pos; i < length 1; i++){datai = datai + 1;}length;return true;}//查找元素int search(int element) {for (int i = 0; i < length; i++){if (datai == element) {return i;}}return -1;}//遍历输出顺序表void traverse(){for (int i = 0; i < length; i++){cout << datai <<"";}cout << endl;}};int main(){SeqList list;listinsert(0, 10);listinsert(1, 20);listinsert(2, 30);listtraverse();listremove(1);listtraverse();int position = listsearch(30);if (position!=-1) {cout <<"元素 30 在位置"<< position << endl;} else {cout <<"未找到元素 30" << endl;}return 0;}```链表的实现:```cppinclude <iostream>using namespace std;class Node {public:int data;Node next;Node(int element) {data = element;next = NULL;}};class LinkedList {private:Node head;public:LinkedList(){head = NULL;}//插入元素void insert(int element) {Node newNode = new Node(element);if (head == NULL) {head = newNode;} else {Node current = head;while (current>next!= NULL) {current = current>next;}current>next = newNode;}}//删除元素void remove(int element) {if (head == NULL) {return;}if (head>data == element) {Node temp = head;head = head>next;delete temp;return;}Node current = head;Node prev = NULL;while (current!= NULL && current>data!= element) {prev = current;current = current>next;}if (current!= NULL) {prev>next = current>next;delete current;}}//查找元素bool search(int element) {Node current = head;while (current!= NULL) {if (current>data == element) {return true;}current = current>next;}return false;}//遍历输出链表void traverse(){Node current = head;while (current!= NULL) {cout << current>data <<"";current = current>next;}cout << endl;}};int main(){LinkedList list;listinsert(10);listinsert(20);listinsert(30);listtraverse();listremove(20);listtraverse();if (listsearch(30)){cout <<"找到元素 30" << endl;} else {cout <<"未找到元素 30" << endl;}return 0;}```性能比较:在插入和删除操作中,顺序表在表头或中间位置操作时需要移动大量元素,时间复杂度较高;而链表只需要修改指针,时间复杂度较低。

数据结构实验报告(实验)

数据结构实验报告(实验)

数据结构实验报告(实验)数据结构实验报告(实验)1. 实验目的1.1 理解数据结构的基本概念和操作1.2 学会使用数据结构解决实际问题1.3 掌握常用数据结构的实现和应用2. 实验环境2.1 操作系统:Windows 102.2 编程语言:C++2.3 开发工具:Visual Studio3. 实验内容3.1 实验一:线性表的实现和应用3.1.1 设计并实现线性表的基本操作函数3.1.2 实现线性表的插入、删除、查找等功能 3.1.3 实现线性表的排序算法3.1.4 应用线性表解决实际问题3.2 实验二:栈和队列的实现和应用3.2.1 设计并实现栈的基本操作函数3.2.2 设计并实现队列的基本操作函数3.2.3 实现栈和队列的应用场景3.2.4 比较栈和队列的优缺点3.3 实验三:树的实现和应用3.3.1 设计并实现二叉树的基本操作函数3.3.2 实现二叉树的创建、遍历和查找等功能3.3.3 实现树的遍历算法(前序、中序、后序遍历)3.3.4 应用树解决实际问题4. 数据结构实验结果4.1 实验一的结果4.1.1 线性表的基本操作函数实现情况4.1.2 线性表的插入、删除、查找功能测试结果4.1.3 线性表的排序算法测试结果4.1.4 线性表解决实际问题的应用效果4.2 实验二的结果4.2.1 栈的基本操作函数实现情况4.2.2 队列的基本操作函数实现情况4.2.3 栈和队列的应用场景测试结果4.2.4 栈和队列优缺点的比较结果4.3 实验三的结果4.3.1 二叉树的基本操作函数实现情况4.3.2 二叉树的创建、遍历和查找功能测试结果 4.3.3 树的遍历算法测试结果4.3.4 树解决实际问题的应用效果5. 实验分析与总结5.1 实验问题与解决方案5.2 实验结果分析5.3 实验总结与心得体会6. 附件附件一:实验源代码附件二:实验数据7. 法律名词及注释7.1 版权:著作权法规定的对原创作品享有的权利7.2 专利:国家授予的在一定时间内对新型发明享有独占权利的证书7.3 商标:作为标识企业商品和服务来源的标志的名称、符号、图案等7.4 许可协议:指允许他人在一定条件下使用自己的知识产权的协议。

数据结构上机实验报告

数据结构上机实验报告
四、 详细设计 1. 实现概要设计中的数据结构 ADT :无 2. 核心函数伪码 : Find(string S, string P, int linenumb)
{ while (i<S.size() && j<P.size())//当找到或者找到头时循环结束 { if (S[i] == P[j]) { i++; j++;} else{ i = i - j + 1; j = 0; }//失配时从下一位继续找 } if (j == P.size()){//找到就输出这一行 cout << "第" << linenumb << "行" << S << endl; }
}
3. 主程序的伪码 :
void main(){ cout << "请输入文件名" << endl; cin >> filename;
ifstream infile(filename.c_str()); cout << "请输入待查找的字符串" << endl; cin >> P; while (getline(infile, S))//读完所有行结束 {
linenumb++; Find(S, P, linenumb); } infile.close(); } int Find(string S, string P, int linenumb) { int i = 0, j = 0; while (i<S.size() && j<P.size())//当找到或者找到头时循环结束 { if (S[i] == P[j]) {

北京科技大学数据结构试验报告(附录含代码)

北京科技大学数据结构试验报告(附录含代码)

一、1)功能描述输入数据(设为整型)建立单链表,并求相邻两节点data值之和为最大的第一节点。

2)详细设计遵循链表建立的基本思想,建立一个新的链表,H为表头,r为新节点,p为表尾节点指针,没存入一个新的数据则申请一个新的节点,知道没有数据输入,利用循环和打擂台法,比较和的大小,并输出。

3)测试分析程序调试完成后,选取两组数据进行测试,都得出了正确结果(数据以0为结束符,若有相同和,则取第一组)结果截图4)心得体会通过做第一题,学习到链表的建立以及链表里指针的使用,并且复习了比较法里面的打擂台法。

二、1)功能描述实现算术表达式求值程序(栈的运用),输入中缀表达式,可将其转换成后缀表达式2)详细设计本题目的程序是根据课本上的程序改进之后得出的,课本上有完整的程序,但是有bug,按照课本上的程序,结果会出现“烫烫烫烫烫”,原因是对于优先级的比较没有处理好,因此加了两行代码,将优先级的比较处理好,即现在的程序。

3)测试分析程序调试完成后,选取题目所给的式子进行测试,得出了正确后缀表达式结果结果截图4)心得体会通过做第二题,对于课本上的知识表示得出“实践出真知”的真理,即使书上的东西也不一定就是正确的,尤其是代码,最好是个人自己真正实践一下。

三、1)功能描述实现链式队列运算程序(队列的运用)2)详细设计本题目是队列相关应用,队列和栈是相反的,队列是先进的先出,因此输入12345,先出的是1,本着队列的这一特性,根据课本所学的队列的算法,设计了如下程序。

3)测试分析程序调试完成后,选取12345进行测试,后缀加0,则一个字符出队,只输入0,则继续出队,输入@,则打印剩余全部元素。

结果截图4)心得体会通过做第三题,对于队列的特点有了更加深刻的认识,尤其区分队列与栈的不同点,需要特别注意。

四、1)功能描述①构造关于F的Huffman树;②求出并打印D总各字符的Huffman编码。

2)详细设计本题目是Huffman树的应用以及Huffman编码的应用,参照课本上关于Huffman树的建立以及Huffman编码的应用的实现,将所给数据依权值最小原则建立Huffman树,并实现Huffman编码。

数据结构上机实验报告

数据结构上机实验报告

数据结构上机实验报告1. 实验目的本次实验旨在通过编写程序,掌握和理解常见的数据结构及其应用。

2. 实验环境与工具- 操作系统:Windows 10- 开发语言:C++- 集成开发环境(IDE):Visual Studio Code3. 实验内容及步骤3.1 线性表操作演示程序设计与分析步骤:a) 设计一个线性表类,并包含以下基本功能:i) 初始化线性表;ii) 插入元素到指定位置;iii) 删除指定位置的元素;iv) 获取指定位置处的元素值。

b)使用该线性表类进行一系列测试,验证各个功能是否正常运行。

记录并分析每个函数调用所消耗时间以评估算法效率。

3.2 栈和队列综合应用设计与模拟步骤:a)根据给出问题需求,在已有栈、队列等相关代码基础上完成如下任务:i)利用两个堆栈来模拟浏览器前进后退功能;ii)使用循环链式存储结构表示双向链队, 并对其进行初始化、入队、出队等操作。

b). 运行以上代码片段,并输出相应结果。

同时分析算法的时间复杂度和空间复杂度。

4. 实验结果与讨论a) 线性表操作演示程序设计与分析实验结果:- 初始化线性表所需时间为X秒;- 插入元素到指定位置平均耗时Y毫秒;- 删除指定位置的元素平均耗时Z毫秒。

b)栈和队列综合应用设计与模拟实验结果:i) 浏览器前进后退功能测试:共浏览N个网页,前进M 次、后退K次。

运行总体消耗时间T1;ii) 双向链队初始化、入队、出对等操作测试: 共进行P 组数据处理, 运行总体消耗时间T2.5. 结论通过本次上机实验,我们掌握了线性表及其相关基本操作,并且成功完成了栈和队列在特定场景下的应用。

同时,在代码编写过程中也深刻理解并评估了各种算法效率。

6. 致谢感谢老师们给予我宝贵意见以及同学们之间相互交流合作提供支持。

7. 附件8. 法律名词及注释在此处添加涉及到的法律名词或术语,并提供简要注释。

数据结构集中上机实验报告

数据结构集中上机实验报告

大学信息与计算科学专业2021级?数据结构?集中上机设计题目:迷宫求解〔非递归求解〕设计时间:2021-2021学年第一学期姓名班级学号成绩目录一、实验内容 2二、需求分析 2三、总体设计 2〔一〕存储结构 2〔二〕流程图 3四、详细设计 3〔一〕根本算法解析 3〔二〕为实现算法,需要的象的数据类型 4(三)函数的调用关系 5〔四〕算法时间、空间复杂度 5五、代码 5六、运行结果分析10〔一〕迷宫路径探索成功10〔二〕迷宫路径未找到的情况 13〔三〕程序的优缺点与改良13七、参考文献14八、心得体会 (14)一、实验内容任务:可以输入一个任意大小的迷宫数据,用非递归的方法求出一条走出迷宫的路径,并将路径输出。

二、需求分析1、可以输入一个任意大小的迷宫数据,用非递归的方法求出一条走出迷宫的路径,并将路径输出;要求使用非递归算法。

2、用户可以根据自己的需求进行输入所需的迷宫,其中1表示迷宫的墙壁,0表示迷宫的通路,从而建立迷宫。

3、可以自行输入迷宫的入口和出口坐标。

4、程序执行的命令包括:〔1〕构造栈函数。

其中包括了构造空栈InitStack;压入新数据元素Push;栈顶元素出栈Pop。

〔2〕构造求迷宫路径函数。

其中定义了二维数组maze[M][N]存取迷宫数据;输出找到的通路MazePath。

3〕建立一个迷宫initmaze。

其中包括输入迷宫行数列数以及各行各列;加一圈围墙并输出迷宫。

三、总体设计(〔一〕存储结构:首先用二维数组存储迷宫数据,迷宫数据由用户输入。

一个以链表结构作存储结构的栈类型,然后编写一个求解迷宫的非递归程序。

求得的通路以三元组〔i,j,d〕形式输出,其中〔i,j〕指示迷宫中的一个坐标,d表示走到下一坐标的方向〔东南西北所用代表数字,自行定义〕。

1.从入口出发,顺着某一个方向进行探索,假设能走通,继续往前走,否那么沿原路退回,换一个方向继续探索,直至出口位置,求得一条通路。

假设所有可能的通路都探索到但没能到达出口,那么所设置的迷宫没有通路。

数据结构第一次上机实验报告

数据结构第一次上机实验报告

数据结构第一次上机实验报告(线性表)实验要求:1、实现顺序表结构的创建、插入、删除、查找等操作;2、利用上述顺序表操作实现如下程序:建立两个顺序表表示的集合(集合中无重复的元素),并求这样的两个集合的并、交和源程序://C++实现//visual studi o 2010下编译通过#include<iostream>#include<vector>#include<algorithm>using namespace std;const size_t MaxSize=20;//顺序表初始分配量class SqList//顺序表类{//privata:int data[MaxSize];int length;//顺序表长度public:void InitList();//初始化void CreatList(int a[],int n);//创建void SearhList();//查找void InsertList();//插入void DeleteList(); //删除};//初始化线性表void SqList::InitList(){length=0;}//创建线性表void SqList::CreatList(int a[],int n){ cout<<"创建的顺序表:\n";for(int i=0;i<n;++i){data[i]=a[i];cout<<data[i]<<" ";}cout<<endl;length=n;}//顺序表的查找void SqList::SearhList(){int k=0;int number;//要查找的数据if(length==0)cout<<"空表"<<endl;else{cout<<"输入要查找的数据:"<<endl;cin>>number;for(int i=0;i<length;++i){if(data[i]==number){k=1;cout<<"查找成功,下标为:"<<i<<endl;break;}//if}//for}//el se}//顺序表的插入void SqList::InsertList(){int i,number;cout<<"请输入要插入的数据:"<<endl;cin>>number;cout<<"输入插入的位置:"<<endl;cin>>i;while(i<1||i>length){cout<<"越界,请重新输入插入位置:"<<endl;cin>>i;}i=i-1;for(int j=length+1;j>i;--j)data[j]=data[j-1];//插入位置后面的元素后移一位data[i]=number;//插入元素length=length+1;//表长加1cout<<"插入元素的线性表:\n";for(int k=0;k<length;++k)cout<<data[k]<<" ";cout<<endl;}//顺序表的删除void SqList::DeleteList(){int i;cout<<"输入要删除的位置:"<<endl;cin>>i;while(i<1||i>length){cout<<"越界,请重新输入要删除的位置:"<<endl;cin>>i;}i=i-1;for(int j=i;j<length-1;++j)data[j]=data[j+1];length=length-1;cout<<"删¦除后的顺序表:\n";for(int k=0;k<length;++k)cout<<data[k]<<" ";cout<<endl;}int main(){SqList L;L.InitList();//初始化int a[10];cout<<"向线性表输入数据(10个各不相等Ì的整数):"<<endl;for(int m=0;m<10;++m)cin>>a[m];L.CreatList(a,10);L.SearhList();L.InsertList();L.DeleteList();cout<<"线性表集合操作"<<endl;vector<int> ivec1;vector<int> ivec2;cout<<"向线性表输入数据(10个各不相等的整数):"<<endl;//以矢量容器的形式存储线性表for(int n=0;n<10;++n){while(cin>>a[n]){ivec1.push_back(a[n]);break;}}cin.clear();cout<<"向线性表输入数据(10个各不相等的整数):"<<endl;for(int n=0;n<10;++n){while(cin>>a[n]){ivec2.push_back(a[n]);break;}}//对线性表进行排序sort(ivec1.begin(),ivec1.end());sort(ivec2.begin(),ivec2.end());cout<<"线性表1排序后:"<<endl;for(vector<int>::iterator iter1=ivec1.begin();iter1!=ivec1.end();++iter1) cout<<*iter1<<" ";cout<<endl;cout<<"线性表2排序后¨:"<<endl;for(vector<int>::iterator iter2=ivec2.begin();iter2!=ivec2.end();++iter2) cout<<*iter2<<" ";cout<<endl;//两线性表的交void AND(vector<int> &ivec1,vector<int> &ivec2);{vector<int> ivec;for(vector<int>::iterator it1=ivec1.begi n();it1!=ivec1.end();++it1){for(vector<int>::iterator it2=ivec2.begi n();it2!=ivec2.end();++it2){if(*it1==*it2)ivec.push_back(*it1);}}cout<<"两线性表的交:"<<endl;if(ivec.empty()) cout<<"为空";else{for(vector<int>::iterator it=ivec.begin();it!=ivec.end();++it)cout<<*it<<" ";}cout<<endl;}//两线性表的并void OR(vector<int> &ivec1,vector<int> &ivec2);{vector<int> ivec;for(vector<int>::iterator it1=ivec1.begi n();it1!=ivec1.end();++it1)ivec.push_back(*it1);for(vector<int>::iterator it2=ivec2.begin();it2!=ivec2.end();++it2)ivec.push_back(*it2);sort(ivec.begin(),ivec.end());vector<int>::iterator end_unique=unique(ivec.begin(),ivec.end());//uni que函数将相同数据中的一个放入最后ivec.erase(end_unique,ivec.end());//erase删除unique函数返回位置到表最后的所有元素cout<<"两线性表的并:"<<endl;for(vector<int>::iterator it=ivec.begin();it!=ivec.end();++it)cout<<*it<<" ";cout<<endl;}//两线性表的差void cha(vector<int> &ivec1,vector<int> &ivec2);{vector<int>::iterator iter1;vector<int>::iterator iter2;int flag = 0;cout<<"线性表1对线性表2的差:"<<endl;for(iter1=ivec1.begin();iter1!=ivec1.end();++iter1){flag = 0;for(iter2=ivec2.begin();iter2!=ivec2.end();++iter2){if((*iter1)==(*iter2)){flag = 1;}}if(flag==0){cout << *iter1 << " ";}}if(flag==1)cout << "为空" << endl;else cout << endl;}}结果:。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

北京科技大学计算机与通信工程学院实验报告实验名称:数据结构上机实验学生姓名:专业:计算机科学与技术班级:学号:指导教师:实验成绩:________________________________实验地点:实验时间:2015 年__ __6 ___月一、实验目的与实验要求1 实验目的(1)加深对常用数据结构和算法设计基本思路、思考方法及其适用场合的理解,并能运用于解决实际问题;(2)能根据特定问题需求,分析建立计算模型(包括逻辑结构和物理结构)、设计算法和程序,并在设计中综合考虑多种因素,对结果的有效性进行分析;(3)训练分析问题、解决问题的能力以及自主学习与程序设计实践能力;(4)形成将非数值型问题抽象为计算模型到算法设计、程序实现、结果有效性分析的能力。

2 实验要求(1)由于在有限的实验课内学时难以较好完成所有实验内容,因此要求在实验课前自主完成部分实验或实验的部分内容;(2)对于每个实验都要针对问题进行分析,设计出有效的数据结构、算法和程序,对实现结果的正确性进行测试,给出测试用例和结果,分析算法的时间复杂度、空间复杂度、有效性和不足,在算法设计和实现过程中体现创新意识,并能综合考虑时空权衡、用户的友好性、程序的模块化和扩展性等;(3)完成的每个实验需要在实验课内经指导教师现场检查、查看程序代码,回答指导教师提出的问题,以确认实验实际完成的质量;(4)在实验报告中体现问题分析、算法思路、算法描述、程序实现和验证、算法和结果的有效性分析。

二、实验设备(环境)及要求Win7、C语言、Dev-C++三、实验内容、步骤与结果分析1 实验1:链表的应用1.1 实验内容输入数据(设为整型)建立单链表,并求相邻两节点data值之和为最大的第一节点。

1.2 主要步骤1.2.1 问题分析与算法思路①采用单链表结构。

②新建链表:每输入一个整数数据,建立一个新节点。

循环操作直到输入结束符结束输入。

③利用一个调用函数求两节点data值之和为最大的第一节点:假设,设一个int类型的变量s=0,读取链表中第一个节点的数据以及它的第二个节点的数据,并计算它们之和a,再计算第二个节点数据和第三个节点数据之和b,如果a>b,则s=a;反之,则s=b。

利用if语句和while语句实现。

④每当输入一个数据,程序会判断输入的时候输入的数据是否是整数,如果不是整数,要求重新输入。

1.2.2 算法描述typedef int datatype; //设当前数据元素为整型typedef struct node //节点类型{datatype data; //节点的数据域struct node *next; //节点的后继指针域}Linknode,*Link;Link Createlist() //创建单链表的算法{int a;Link H,P,r; //H,P,r分别为表头,新节点和表尾节点指针H=(Link)malloc(sizeof(Linknode)); //建立头节点r=H;scanf(“%d”,&a); //输入一个数据while(a!=0){P=(Link)malloc(sizeof(Linknode));//申请新节点P->data=a; //存入数据r->next=P; //新节点链入表尾r=P;scanf(“%d”,&a); //输入下一个数据}r->next=NULL; //将尾节点的指针域置空return(H); //返回已创建的头节点}Link Adjmax(Link H) //求链表中相邻两节点data值之和为最大的第一节点的指针的算法{Link p,p1,q;int i,j;p=p1=H->next;if(p1==NULL) return(p1); //表空返回q=p->next;if(q==NULL) return(p1); //表长=1时返回i=p->data+q->data; //相邻两节点data值之和while(q->next){p=q;q=q->next; //取下一对相邻节点的指针j=p->data+q->data;if(j>i){p1=p;i=j; //取和为最大的第一节点指针}}return (p1);}1.2.3 程序实现#include<stdio.h>#include<stdlib.h>typedef int datatype; //设当前数据元素为整型typedef struct node //节点类型{datatype data; //节点的数据域struct node *next; //节点的后继指针域}Linknode,*Link; //linknode为节点说明符,link为节点指针说明符Link Createlist() //创建单链表的算法{int a,c;float b;Link H,P,r; //H,P,r分别为表头,新节点和表尾节点指针H=(Link)malloc(sizeof(Linknode)); //建立头节点r=H;do{c=(fflush(stdin),scanf("%f",&b));//printf("%d",c); //判断输入的是否是整数a=(int)b;if(c!=1||a!=b||a<-32768||a>32767) printf("非法输入!请重新输入!\n");}while(c!=1||a!=b||a<-32768||a>32767);while(a!=0){P=(Link)malloc(sizeof(Linknode));//申请新节点P->data=a; //存入数据r->next=P; //新节点链入表尾r=P;do{c=(fflush(stdin),scanf("%f",&b)); //判断输入的是否是整数a=(int)b;if(c!=1||a!=b||a<-32768||a>32767) printf("非法输入!请重新输入!\n");}while(c!=1||a!=b||a<-32768||a>32767);}r->next=NULL; //将尾节点的指针域置空return(H); //返回已创建的头节点}Link Adjmax(Link H) //求链表中相邻两节点data值之和为最大的第一节点的指针的算法{Link p,p1,q;int i,j;p=p1=H->next;if(p1==NULL) return(p1); //表空返回q=p->next;if(q==NULL) return(p1); //表长=1时返回i=p->data+q->data; //相邻两节点data值之和while(q->next){p=q;q=q->next; //取下一对相邻节点的指针j=p->data+q->data;if(j>i){p1=p;i=j; //取和为最大的第一节点指针}}return (p1);}void main() //主函数{Link A,B,p,q;int a,b;do{printf("请输入一组整数(以0为结束符,数之间回车):\n");p=A=Createlist(); //创建新链表B=Adjmax(A); //求链表中相邻两节点data值之和为最大的第一节点的指针a=(int)(B->data); //取第一节点的data值printf("第一节点的data值为:%d\n",a);while(p->next) //释放链表空间{q=p;p=p->next;free(q);}free(p);printf("是否继续输入下一组整数:是:1,否:0\n");scanf("%d",&b);}while(b);}1.3 结果分析①输入的数组为:2 6 4 7 3,输出结果:第一节点为4。

结果是正确的。

②输入的数组为:45 21 456 4 214 54 230,输出结果:第一节点为21。

结果是正确的。

③输入的数组为:45 7 23 564 70 1224 12 145 24,输出结果:第一节点为70。

结果是正确的。

1.3.1 测试如图所示,只要输入的数据不是整数(字符或小数),或者输入的整数不在[32768,32767]这个范围,程序会用"非法输入!请重新输入!"提示用户,直到用户输入正确的数据。

1.3.2 算法和结果的有效性分析时间复杂度:O(n)空间复杂度:不复杂有效性:算法正确,算法易读、易编码和易于调试不足:每个数据输入之间只能用回车区分。

2 实验2:栈的应用2.1 实验内容设操作数:0,1,2,……,8,9(可扩充);运算符:+,-,*,/,(,),#(#号为结束)。

输入中缀表达式,将其转换成后缀表达式,然后计算,输出结果。

例如:输入中缀表达式5+(4-2)*3 #,将其转换成后缀表达式:542-3*+#,然后计算,本例结果为11。

2.2 主要步骤2.2.1 问题分析与算法思路①利用栈来写程序。

②首先要获得中缀表达式,再利用一个调用函数是中缀表达式变为后缀表达式。

再用一个函数求后缀表达式的值。

③利用一个调用函数取判断中缀表达式的合法性。

2.2.2 算法描述typedef struct node{char data;struct node *next;}snode,*slink;typedef struct node1{int data;struct node1 *next;}snode1,*slink1;void Clearstack(slink s) //置栈空{s=NULL;}int Emptystack(slink s) //判断栈是否为空{if(s==NULL) return(1); //栈空返回1else return(0); //栈非空返回0}char Getstop(slink s) //取栈顶元素{if(s!=NULL) return (s->data);return (0);}void Push(slink*s,char x) //元素x进栈{slink p;p=(slink)malloc(sizeof(snode)); //生成进栈p节点p->data=x; //存入新元素p->next=*s; //p节点作为新的栈顶链入*s=p;}char Pop(slink*s) //出栈{char x;slink p;if(Emptystack(*s)) return (-1); //栈空,返回-1else{x=(*s)->data;p=*s;*s=(*s)->next;free(p);return (x); //成功}}int Precede(char x,char y) //比较x是否"大于"y{int a,b;switch(x){case '#':case '(':a=0;break;case '+':case '-':a=1;break;case '*':case '/':a=2;break;}switch(y){case '+':case '-':b=1;break;case '*':case '/':b=2;break;case '(':b=3;break;}if(a>=b) return (1);else return (0);}void Mid_post(char E[],char B[]) //中缀表达式B到后缀表达式E的转换{int i=0,j=0;char x; int a;slink s=NULL; //置空栈Clearstack(s);Push(&s,'#'); //结束符入栈do{x=B[i++]; //扫描当前表达式分量xswitch(x){case ' ':break;case '#':{while(!Emptystack(s)){E[j++]=' '; //栈非空时E[j++]=Pop(&s);}}break;case ')':{while(Getstop(s)!='('){E[j++]=' ';E[j++]=Pop(&s);} //反复出栈直到遇到'('Pop(&s); //退掉'('}break;case '+':case '-':case '*':case '/':case '(':{while(Precede(Getstop(s),x)) //栈顶运算符(Q1)与x比较{E[j++]=' ';E[j++]=Pop(&s); //Q1>=x时,输出栈顶符兵退栈}//E[j++]=' ';Push(&s,x); //Q1<x时,x进栈E[j++]=' ';}break;default:E[j++]=x; //操作数直接输出}}while(x!='#');E[j]='\0';Clearstack(s);}int Ecount(char E[]) //后缀表达式求值{int i=0,g=0,k=0,d=0,d1,g1;char x;int z,a,b;slink1 s=NULL; //置栈空while(E[i]!='#') //扫描每一个字符是送x{x=E[i];switch(x){case ' ':break;case '+':b=Pop1(&s);a=Pop1(&s);z=a+b;Push1(&s,z);break;case '-':b=Pop1(&s);a=Pop1(&s);z=a-b;Push1(&s,z);break;case '*':b=Pop1(&s);a=Pop1(&s);z=a*b;Push1(&s,z);break;case '/':b=Pop1(&s);a=Pop1(&s);z=a/b;Push1(&s,z);break; //执行相应运算结果进栈default:{g=0;g1=0; //获取操作数while(E[i]!=' '){g1=E[i]-'0';g=g*10+g1;i++;}Push1(&s,g); //操作数进栈}}i++;}if(!Emptystack1(s)) return(Getstop1(s)); //返回结果Clearstack1(s);}2.2.3 程序实现#include<stdio.h>#include<stdlib.h>#include<string.h>typedef struct node{char data;struct node *next;}snode,*slink;typedef struct node1{int data;struct node1 *next;}snode1,*slink1;void Clearstack(slink s) //置栈空{s=NULL;}int Emptystack(slink s) //判断栈是否为空{if(s==NULL) return(1); //栈空返回1else return(0); //栈非空返回0}char Getstop(slink s) //取栈顶元素{if(s!=NULL) return (s->data);return (0);}void Push(slink*s,char x) //元素x进栈{slink p;p=(slink)malloc(sizeof(snode)); //生成进栈p节点p->data=x; //存入新元素p->next=*s; //p节点作为新的栈顶链入*s=p;}char Pop(slink*s) //出栈{char x;slink p;if(Emptystack(*s)) return (-1); //栈空,返回-1else{x=(*s)->data;p=*s;*s=(*s)->next;free(p);return (x); //成功}}void Push1(slink1*s,int x) //元素x进栈{slink1 p;p=(slink1)malloc(sizeof(snode1)); //生成进栈p节点p->data=x; //存入新元素p->next=*s; //p节点作为新的栈顶链入*s=p;}int Pop1(slink1*s) //出栈{int x;slink1 p;if(Emptystack1(*s)) return (-1); //栈空,返回-1else{x=(*s)->data;p=*s;*s=(*s)->next;free(p);return (x); //成功}}int Emptystack1(slink1 s) //判断栈是否为空{if(s==NULL) return(1); //栈空返回1else return(0); //栈非空返回0}void Clearstack1(slink1 s) //置栈空{s=NULL;}int Getstop1(slink1 s) //取栈顶元素{if(s!=NULL) return (s->data);return (0);}int Precede(char x,char y) //比较x是否"大于"y{int a,b;switch(x){case '#':case '(':a=0;break;case '+':case '-':a=1;break;case '*':case '/':a=2;break;}switch(y){case '+':case '-':b=1;break;case '*':case '/':b=2;break;case '(':b=3;break;}if(a>=b) return (1);else return (0);}void Mid_post(char E[],char B[]) //中缀表达式B到后缀表达式E的转换{int i=0,j=0;char x; int a;slink s=NULL; //置空栈Clearstack(s);Push(&s,'#'); //结束符入栈do{x=B[i++]; //扫描当前表达式分量xswitch(x){case ' ':break;case '#':{while(!Emptystack(s)){E[j++]=' '; //栈非空时E[j++]=Pop(&s);}}break;case ')':{while(Getstop(s)!='('){E[j++]=' ';E[j++]=Pop(&s);} //反复出栈直到遇到'('Pop(&s); //退掉'('}break;case '+':case '-':case '*':case '/':case '(':{while(Precede(Getstop(s),x)) //栈顶运算符(Q1)与x比较{E[j++]=' ';E[j++]=Pop(&s); //Q1>=x时,输出栈顶符兵退栈}Push(&s,x); //Q1<x时,x进栈E[j++]=' ';}break;default:E[j++]=x; //操作数直接输出}}while(x!='#');E[j]='\0';Clearstack(s);}int Ecount(char E[]) //后缀表达式求值{int i=0,g=0,k=0,d=0,d1,g1;char x;int z,a,b;slink1 s=NULL; //置栈空while(E[i]!='#') //扫描每一个字符是送x{x=E[i];switch(x){case ' ':break;case '+':b=Pop1(&s);a=Pop1(&s);z=a+b;Push1(&s,z);break;case '-':b=Pop1(&s);a=Pop1(&s);z=a-b;Push1(&s,z);break;case '*':b=Pop1(&s);a=Pop1(&s);z=a*b;Push1(&s,z);break;case '/':b=Pop1(&s);a=Pop1(&s);z=a/b;Push1(&s,z);break; //执行相应运算结果进栈default:{g=0;g1=0; //获取操作数while(E[i]!=' '){g1=E[i]-'0';g=g*10+g1;i++;}Push1(&s,g); //操作数进栈}}i++;}if(!Emptystack1(s)) return(Getstop1(s)); //返回结果Clearstack1(s);}int pd(char B[]) //判断输入错误{ int i=0,c,j,k;c=strlen(B); //获取B的长度while(B[i]!='#'){switch(B[i]) //检查有无非法字符{case ' ':break;case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8':case '9':{ j=i+1; //一个操作数之间不能有空格if(B[j]==' '){while(B[j]==' ') j++;switch(B[j]){case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8':case '9':printf("非法输入!请重新输入!\n");return(0);break;}}}break;case '+':case '-':case '*':case '/':{j=i-1;while(B[j]==' ') j--;switch(B[j]){ //'+','-','*','/'左边不能有'+','-','*','/','(','#'case '+':case '-':case '*':case '/':case '(':case '#':printf("非法输入!请重新输入!\n");return(0);break;}k=i+1;while(B[k]==' ') k++;switch(B[k]) //'+','-','*','/'左边不能有'+','-','*','/',')','#'{case '+':case '-':case '*':case '/':case ')':case '#':printf("非法输入!请重新输入!\n");return(0);break;}}break;case '(': //'('左边不能有'0'~'9','#',')'{j=i-1;while(B[j]==' ') j--;switch(B[j]){case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8':case '9':case '#':case ')':printf("非法输入!请重新输入!\n");return(0);break;}k=i+1;while(B[k]==' ') k++;switch(B[k]) //'('右边不能有'+','-','*','/','#'{case '+':case '-':case '*':case '/':case '#':printf("非法输入!请重新输入!\n");return(0);break;}}break;case ')': //')'左边不能有'('{j=i-1;while(B[j]==' ') j--;switch(B[j]){case '(':printf("非法输入!请重新输入!\n");return(0);break;}k=i+1;while(B[k]==' ') k++; //')'右边不能有'0'~'9'switch(B[k]){case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8':case '9':printf("非法输入!请重新输入!\n");return(0);break;}}break;case '\0':break;default:printf("8非法输入!请重新输入!\n");return(0);}i++;}if(B[0]=='#'){printf("表达式为空!请重新输入!\n");return(0);}else if (B[c-1]!='#'){printf("9非法输入!请重新输入!\n");return(0);}}void main(){int a,b,c,d;char B[100],E[100];do{do{printf("请输入中缀表达式:\n");B[100]=fflush(stdin);gets(B); //输入Bwhile(B[0]=='\0'){B[100]=fflush(stdin);gets(B);}b=pd(B); //判断B是否合法}while(b==0);Mid_post(E,B);printf("后缀表达式为:\n");printf("%s\n",E);a=Ecount(E);printf("结果=%d\n",a);printf("是否继续?是:1否:0\n");scanf("%d",&c);}while(c==1);}2.3 结果分析①输入的中缀表达式为:5+(4-2)*3,输出的后缀表达式为:5 4 2 -3 * +,后缀表达式求值结果为:11。

相关文档
最新文档