北京理工大学数据结构实验报告2
- 格式:doc
- 大小:82.50 KB
- 文档页数:17
一、实验名称数据结构实验二:链表的基本操作二、实验目的1. 理解链表的基本概念和结构。
2. 掌握链表的创建、插入、删除、查找等基本操作。
3. 提高编程能力,巩固数据结构知识。
三、实验环境1. 操作系统:Windows 102. 编程语言:C++3. 开发环境:Visual Studio 2019四、实验原理链表是一种常见的线性数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。
链表具有以下特点:1. 无固定长度,可以根据需要动态地添加或删除节点。
2. 链接方式灵活,便于实现各种操作。
3. 适合存储具有动态变化的数据。
本实验主要实现以下功能:1. 创建链表:根据用户输入的数据,创建一个单链表。
2. 插入节点:在链表的指定位置插入一个新节点。
3. 删除节点:删除链表中的指定节点。
4. 查找节点:在链表中查找一个指定的节点。
5. 打印链表:遍历链表并打印所有节点数据。
五、实验步骤1. 创建链表```cppstruct ListNode {int data;ListNode next;ListNode(int x) : data(x), next(nullptr) {}};ListNode createList() {ListNode head = nullptr, tail = nullptr;int data;cout << "请输入链表数据(输入-1结束):" << endl; while (cin >> data && data != -1) {ListNode node = new ListNode(data);if (head == nullptr) {head = node;tail = node;} else {tail->next = node;tail = node;}}return head;}```2. 插入节点```cppvoid insertNode(ListNode head, int data, int position) { ListNode node = new ListNode(data);if (position == 0) {node->next = head;head = node;} else {ListNode current = head;for (int i = 0; i < position - 1; ++i) {if (current == nullptr) {cout << "插入位置超出链表长度!" << endl; return;}current = current->next;}node->next = current->next;current->next = node;}}```3. 删除节点```cppvoid deleteNode(ListNode head, int position) {if (head == nullptr) {cout << "链表为空!" << endl;return;}if (position == 0) {ListNode temp = head;head = head->next;delete temp;} else {ListNode current = head;for (int i = 0; i < position - 1; ++i) {if (current == nullptr) {cout << "删除位置超出链表长度!" << endl; return;}current = current->next;}if (current->next == nullptr) {cout << "删除位置超出链表长度!" << endl;return;}ListNode temp = current->next;current->next = temp->next;delete temp;}}```4. 查找节点```cppListNode findNode(ListNode head, int data) { ListNode current = head;while (current != nullptr) {if (current->data == data) {return current;}current = current->next;}return nullptr;}```5. 打印链表```cppvoid printList(ListNode head) {ListNode current = head;while (current != nullptr) {cout << current->data << " ";current = current->next;}cout << endl;}```六、实验结果与分析通过以上步骤,成功实现了链表的基本操作。
《数据结构与算法设计》实验报告——实验一学院:班级:学号:姓名:一、实验目的1.通过实验实践、巩固线性表的相关操作;2.熟悉VC环境,加强编程、调试的练习;3.用C语言编写函数,实现循环链表的建立、插入、删除、取数据等基本操作;4.理论知识与实际问题相结合,利用上述基本操作实现约瑟夫环。
二、实验内容1、采用单向环表实现约瑟夫环。
请按以下要求编程实现:①从键盘输入整数m,通过create函数生成一个具有m个结点的单向环表。
环表中的结点编号依次为1,2,……,m。
②从键盘输入整数s(1<=s<=m)和n,从环表的第s个结点开始计数为1,当计数到第n个结点时,输出该第n结点对应的编号,将该结点从环表中消除,从输出结点的下一个结点开始重新计数到n,这样,不断进行计数,不断进行输出,直到输出了这个环表的全部结点为止。
三、程序设计1、概要设计为实现上述程序功能,应用单向环表寄存编号,为此需要建立一个抽象数据类型:单向环表。
(1)、单向环表的抽象数据类型定义为:ADT Joseph{数据对象:D={ai|ai∈ElemSet,i=1,2,3……,n,n≥0}数据关系:R1={ <ai-1,ai>|ai∈D,i=1,2,……,n}基本操作:create(&L,n)操作结果:构造一个有n个结点的单向环表L。
show(L)初始条件:单向环表L已存在。
操作结果:按顺序在屏幕上输出L的数据元素。
Josephf( L,m,s,n)初始条件:单向环表L已存在, s>0,n>0,s<m。
操作结果:返回约瑟夫环的计算结果。
}ADT Joseph(2)、主程序流程主程序首先调用create(&L,n)函数,创建含有m个节点的单向环表L,然后调用show(L)函数,顺序输出链表中的数据,最后调用Josephf( L,m,s,n)函数,依次输出报的数。
(3)、函数调用关系图2、详细设计(1)、数据类型设计typedef int ElemType; //定义元素类型typedef struct Lnode{ElemType data;struct Lnode *next;}Lnode,*Linklist; //定义节点类型,指针类型(2)、操作算法程序实现:void create(Linklist &L,int m){//生成一个具有m个结点的单向环表,环表中的结点编号依次为1,2,……,m Linklist h,p;L=(Linklist)malloc(sizeof(Lnode));L->data = 1;h=L;for(int i=2;i<=m;i++){p = (Linklist)malloc(sizeof(Lnode));p->data = i; //生成新节点,数据为节点编号h->next = p;h = p; //插入链表}h->next = L; //形成循环链表}void show(Linklist L,int m){//从第一个节点开始依次输出节点编号printf("The numbers of the list are: \n"); //提示用户Linklist h;h=L;for(int i=1;i<=m;i++){printf("%d ",h->data);h = h->next;}printf("\n");}void Josephf(Linklist &L,int m,int s,int n){//实现约瑟夫环Linklist h,q;h = L;q = L;while(h->data != s) //定位开始的节点h = h->next;while(q->next!=h) //定位在开始位置的上一个节点q = q->next;for(int j=1;j<=m;j++){int i=1;while(i<n){q=q->next;i++;}printf("%d ",q->next->data); //依次输出报号为n的节点q->next = q->next->next; //删除已输出节点}printf("\n");}(3)、主程序的代码实现:int main(){int s,m,n;Linklist L;printf("请输入节点数m:\n");scanf("%d",&m);create(L,m); //建立循环链表show(L,m); //输出链表数据printf("请输入起始位置s:\n");scanf("%d",&s);printf("请输入报的数n:\n");scanf("%d",&n);Josephf(L,m,s,n); //输出所报数字return 0;}四、程序调试分析1.引用标识符&不符合C语言语法,应使用C++;2.为了实现循环链表,建立时应该不设头结点且第一个节点就存储编号数据;3.删除节点时要定位到前一个指针,所以在定位开始位置后还要再定位到前一个指针;4.输出时要注意增加“ ”(空格)和“\n”(换行),使输出易于辨识。
数据库系统开发实验报告1.2 实验二:触发器的创建与测试1.2.1内容检查订单明细表Sales.SalesOrderDetail中的信息,如果修改记录中的产品单价UnitPrice大于产品公开报价(Production.Product.ListPrice),则不能进行修改并抛出错误信息,否则,进行修改并将修改的有关信息写到Production.ProuctUpdateLog表中。
1.2.2要求1.使用RAISEERROR抛出错误信息。
2.修改信息记录表Production.ProductUpdateLog的内容:记录编号、订单编号、订单明细编号、产品编号、产品的公开报价、修改前产品的单价、修改后产品的单价、修改者的登录名。
使用存储过程完成该功能,并在存储过程中调用该存储过程。
3.给出触发器和存储过程的源代码和简要的说明(可以在代码中使用注释进行说明)。
4.设计触发器测试方案并给出测试的命令和结果,必要时可对测试结果进行分析。
实验内容:首先,用Windows系统下的登录,附加数据库AdventureWorks按照实验内容,我们先来查询一下AdventureWorks中的订单明细表Sales.SalesOrderDetail。
语句:USE AdventureWorksGOSELECT*FROM Sales.SalesOrderDetailGO查询结果如下:根据实验内容,创建名为Production.ProuctUpdateLog(产品更新日志)的表。
其属性分别为记录编号,订单编号,订单明细编号,产品编号,产品公开报价,修改前产品的单价,修改后产品单价,修改者登录名。
语句:/*记录编号,订单编号,订单明细编号,产品编号,产品公开报价,修改前产品的单价,修改后产品单价,修改者登录名*/USE AdventureWorksGOCREATE TABLE Production.ProductUpdateLog(记录编号int IDENTITY primary key,订单编号int not null,订单明细编号int not null,产品编号int not null,产品公开报价money,修改前产品单价money,修改后产品单价money,修改者登录名nvarchar(50) not null)GO运行结果如下:将修改者登录名设为不准为空,同时用IDENTITY关键字设主键“记录编号”为自动增长。
数据结构实验报告实验报告数据结构实验报告应包含以下几个部分:1. 实验目的:简要介绍实验的目的和意义。
2. 原理介绍:详细介绍本次实验所涉及的数据结构原理,包括数据结构的定义、特性以及相关算法或操作。
3. 实验内容:详细描述本次实验的具体内容,包括实验要求和实验步骤。
4. 实验结果:展示实验的结果,以适当的方式呈现实验数据和实验输出。
可以包括图表、表格、代码等。
5. 分析讨论:分析实验结果,讨论实验结果与预期结果的差异,并给出相应的解释。
6. 实验总结:对本次实验的总结和评价,包括实验的收获、不足之处以及改进的建议。
以下是一个简单的数据结构实验报告的范例:实验目的:本次实验的目的是熟悉链表数据结构的概念和基本操作,包括链表的插入、删除和查找等。
原理介绍:链表是一种常用的数据结构,它由一组节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。
链表中的节点可以通过指针相互连接,从而形成一串有序的数据。
链表不同于数组,它的插入和删除操作十分高效,但查找效率较低。
实验内容:本次实验要求实现一个链表,并在链表中实现插入、删除和查找操作。
首先,定义一个节点结构,并实现节点的插入和删除操作;其次,实现查找操作,并根据查找结果返回节点位置或者相关信息。
实验结果:经过实验,我们得到了以下结果:在链表中插入节点的时间复杂度为O(1),删除节点的时间复杂度为O(1),查找节点的时间复杂度为O(n)。
分析讨论:从结果可以看出,链表的插入和删除操作的效率较高,但查找操作的效率较低。
这是因为链表中的节点没有连续的存储空间,所以需要遍历整个链表才能找到目标节点。
如果需要频繁进行查找操作,可以考虑使用其他数据结构,如二叉搜索树或哈希表。
实验总结:通过本次实验,我们深入了解了链表数据结构的原理和基本操作,并实现了一个简单的链表。
在以后的学习和实践中,我们可以根据实际需求选择合适的数据结构,以提高程序的效率和性能。
此外,本次实验也让我们更加熟悉了编程的过程和技巧。
本科实验报告实验名称:遍历二叉树课程名称:数据结构实验时间:任课教师:实验地点:良乡机房实验教师:实验类型:□原理验证■综合设计□自主创新学生姓名:学号/班级:组号:学院:同组搭档:专业:成绩:一、实验目的1、熟悉VC环境,学习使用C语言实现树的基本操作。
2、通过编程、上机调试,进一步理解数、二叉数、拓展二叉数的基本概念。
3、了解并熟悉二叉数的存储结构及其各种操作,掌握各种二叉数的遍历方法。
4、锻炼动手编程,独立思考的能力。
二、实验题目遍历二叉树(1)问题描述遍历二叉树:要求:请输入一棵二叉树的扩展的前序序列,经过处理后生成一棵二叉树,然后对于该二叉树输出前序、中序和后序遍历序列。
例如:124*5***3**三、实验基础知识线性表、二叉树的基本概念的熟练掌握并实际运用。
并了解创建树、遍历二叉树的思想解决问题的能力四、实验设计方法1、概要设计为实现上述程序功能,首先需要二叉树的抽象数据结构。
⑴二叉树的抽象数据类型定义为:ADT BinaryTree {数据对象D:D是具有相同特性的数据元素的集合。
数据关系R:若D=Φ,则R=Φ,称BinaryTree为空二叉树;若D≠Φ,则R={H},H是如下二元关系;(1)在D中存在惟一的称为根的数据元素root,它在关系H下无前驱;(2)若D-{root}≠Φ,则存在D-{root}={D1,Dr},且D1∩Dr =Φ;(3)若D1≠Φ,则D1中存在惟一的元素x1,<root,x1>∈H,且存在D1上的关系H1 ⊆H;若Dr≠Φ,则Dr中存在惟一的元素xr,<root,xr>∈H,且存在上的关系Hr ⊆H;H={<root,x1>,<root,xr>,H1,Hr};(4)(D1,{H1})是一棵符合本定义的二叉树,称为根的左子树;(Dr,{Hr})是一棵符合本定义的二叉树,称为根的右子树。
基本操作:CreateTree(&T)操作结果:按先序次序建立二叉链表表示的二叉树TPreOrderTraverse( T,Visit())初始条件:二叉树T已经存在,visit是对结点操作的应用函数操作结果:先序遍历二叉树T ,对每个结点调用visit函数仅一次;一旦visit()失败,则操作失败。
数据结构实验报告2数据结构实验报告21、实验目的本次实验的目的是通过使用数据结构来解决一个特定的问题。
具体而言,我们将会使用某种数据结构(例如链表、堆栈、队列等)来实现一个特定功能,并对其性能进行评估。
2、实验背景在本次实验中,我们将会探索数据结构在解决实际问题中的应用。
数据结构是计算机科学的重要组成部分,它提供了一种组织和管理数据的方式,以便能够高效地访问和操作这些数据。
3、实验内容在本次实验中,我们选择了一种经典的数据结构,以实现一个特定的功能。
具体而言,我们将会使用链表来实现一个简单的联系人管理系统。
3.1 数据结构选择我们选择了链表作为联系人管理系统的数据结构。
链表是一种灵活的数据结构,它能够动态地增加或删除元素,并且支持高效的插入和删除操作。
3.2 实现功能我们的联系人管理系统将会具有以下功能:- 添加联系人:用户可以输入联系人的姓名、方式号码等信息,并将其添加到联系人列表中。
- 删除联系人:用户可以选择要删除的联系人,并从列表中删除该联系人。
- 查找联系人:用户可以根据姓名或方式号码来查找联系人,并显示相关信息。
- 显示所有联系人:系统将会将所有联系人按照姓名的字母顺序进行排序,并将其显示在屏幕上。
4、实验步骤下面是本次实验的具体步骤:4.1 初始化联系人管理系统在系统开始之前,我们需要初始化联系人管理系统。
这包括创建一个空的联系人列表,并提供用户菜单来选择相应功能。
4.2 添加联系人用户可以选择添加联系人的功能,并输入联系人的相关信息。
系统将会将联系人添加到联系人列表中。
4.3 删除联系人用户可以选择删除联系人的功能,并输入要删除联系人的姓名或方式号码。
系统将会在联系人列表中查找并删除相应联系人。
4.4 查找联系人用户可以选择查找联系人的功能,并输入要查找联系人的姓名或方式号码。
系统将会在联系人列表中查找相应联系人,并显示其相关信息。
4.5 显示所有联系人用户可以选择显示所有联系人的功能。
数据结构实验报告2一、实验目的本次数据结构实验旨在通过实际操作和编程实践,深入理解和掌握常见的数据结构,如链表、栈、队列、树等,并能够运用所学知识解决实际问题,提高编程能力和算法设计能力。
二、实验环境本次实验使用的编程语言为C++,开发环境为Visual Studio 2019。
三、实验内容(一)链表的实现与操作1、单向链表的创建首先,定义了链表节点的结构体,包含数据域和指向下一个节点的指针域。
然后,通过函数实现了单向链表的创建,从用户输入获取节点的数据,依次创建新节点并连接起来。
2、链表的遍历编写函数实现对单向链表的遍历,依次输出每个节点的数据。
3、链表的插入与删除实现了在指定位置插入节点和删除指定节点的功能。
插入操作时,需要找到插入位置的前一个节点,修改指针完成插入。
删除操作时,同样找到要删除节点的前一个节点,修改指针并释放删除节点的内存。
(二)栈的实现与应用1、栈的基本操作使用数组实现了栈的数据结构,包括入栈、出栈、判断栈空和获取栈顶元素等操作。
2、表达式求值利用栈来实现表达式求值的功能。
将表达式中的数字和运算符分别入栈,按照运算规则进行计算。
(三)队列的实现与应用1、队列的基本操作使用循环数组实现了队列,包括入队、出队、判断队空和队满等操作。
2、模拟银行排队系统通过创建队列来模拟银行客户的排队情况,实现客户的入队和出队操作,统计平均等待时间等。
(四)二叉树的遍历1、二叉树的创建采用递归的方式创建二叉树,用户输入节点数据,构建二叉树的结构。
2、先序、中序和后序遍历分别实现了二叉树的先序遍历、中序遍历和后序遍历,并输出遍历结果。
四、实验结果与分析(一)链表实验结果成功创建、遍历、插入和删除单向链表。
通过对链表的操作,深入理解了链表的动态存储特性和指针的运用。
在插入和删除操作中,能够正确处理指针的修改和内存的释放,避免了内存泄漏和指针错误。
(二)栈实验结果栈的基本操作运行正常,能够正确实现入栈、出栈等功能。
数据结构实验报告数据结构实验报告精选2篇(一)实验目的:1. 熟悉数据结构的基本概念和基本操作;2. 掌握线性表、栈、队列、链表等经典数据结构的实现方法;3. 掌握数据结构在实际问题中的应用。
实验内容:本次实验主要包括以下几个部分:1. 线性表的实现方法,包括顺序表和链表,分别使用数组和链表来实现线性表的基本操作;2. 栈的实现方法,包括顺序栈和链式栈,分别使用数组和链表来实现栈的基本操作;3. 队列的实现方法,包括顺序队列和链式队列,分别使用数组和链表来实现队列的基本操作;4. 链表的实现方法,包括单链表、双链表和循环链表,分别使用指针链、双向链和循环链来实现链表的基本操作;5. 综合应用,使用各种数据结构来解决实际问题,例如使用栈来实现括号匹配、使用队列来实现马铃薯游戏等。
实验步骤及结果:1. 线性表的实现方法:a) 顺序表的基本操作:创建表、插入元素、删除元素、查找元素等;b) 链表的基本操作:插入节点、删除节点、查找节点等;c) 比较顺序表和链表的优缺点,分析适用场景。
结果:通过实验,确认了顺序表适用于频繁查找元素的情况,而链表适用于频繁插入和删除节点的情况。
2. 栈的实现方法:a) 顺序栈的基本操作:进栈、出栈、判空、判满等;b) 链式栈的基本操作:进栈、出栈、判空、判满等。
结果:通过实验,掌握了栈的基本操作,并了解了栈的特性和应用场景,例如括号匹配。
3. 队列的实现方法:a) 顺序队列的基本操作:入队、出队、判空、判满等;b) 链式队列的基本操作:入队、出队、判空、判满等。
结果:通过实验,掌握了队列的基本操作,并了解了队列的特性和应用场景,例如马铃薯游戏。
4. 链表的实现方法:a) 单链表的基本操作:插入节点、删除节点、查找节点等;b) 双链表的基本操作:插入节点、删除节点、查找节点等;c) 循环链表的基本操作:插入节点、删除节点、查找节点等。
结果:通过实验,掌握了链表的基本操作,并了解了链表的特性和应用场景。
实验二实验报告表
实验名称:
学号姓名:班级:实验时间:
实验报告表2-1 数值型数据在计算机中的二进制实验记录表
说明:本实验对计算机内存数据的存放拟定为:①整数用两个字节存储,并负数只考虑原码;②实数用4个字节存储,其中阶码部分占一个字节。
实验报告表2-2 其他进制数据与二进制转化实验记录表
实验报告表2-3 数据的原码、补码和反码表示实验记录表
实验报告表2-4 二进制算术运算实验记录表
实验报告表2-5溢出实验记录表
实验报告表2-6浮点数的小数点浮动实验记录表
实验报考表2-7 表示浮点数的二进制串中阶码位数改变实验记录表。
《数据结构与算法设计》实验报告——实验二学院:自动化学院班级:06111001学号:**********姓名:宝竞宇一、实验目的掌握栈的建立,输入,删除,出栈等基本操作。
应用栈解决实际问题。
二、实验内容实现简单计算器的功能,请按照四则运算加、减、乘、除、幂(^)和括号的优先关系和惯例,编写计算器程序。
要求支持运算符:+、-、*、/、%、()和=:①从键盘输入一个完整的表达式,以回车作为表达式输入结束的标志;②输入表达式中的数值均为大于等于零的整数,如果中间计算过程中出现小数也只取整进行计算。
例如,输入:4+2*5= 输出:14输入:(4+2)*(2-10)= 输出:-48三、程序设计1、概要设计抽象数据类型定义:两个栈结构,分别用来储存数据和计算符号宏定义:函数“成功”,“失败的返回值”在主程序程序中先依次输入各表达式,存入相应各栈,然后,调用“判断函数”来判断计算符的优先次序,然后再利用计算函数来计算,表达式值。
其中还有,取栈顶元素函数,存入栈函数。
2、详细设计数据类型实现:struct t{ char dat[200];int top;}prt;入栈函数:存入数组,栈顶指针上移void pushd(long int a){ prd.dat[prd.top++]=a;}出栈:取出对应值,栈顶指针下移long int popd( ){ return prd.dat[--prd.top];}比较优先级:建立数组,比较返回大于小于号。
计算函数:以字符型输入,运算符号,用switch来分支计算判断,返回计算数值long int operation ( long int x, long int y, char a){ s witch(a){ case '+': return x+y;case '-': return x-y;case '*': return x*y;case '/': if ( y )return x/y;else{ printf("Divide 0.\n");return 0;}case '%': return (long int) fmod(x,y);case '^': if (y>=0 ) return (long int) pow(x,y);else return (0);default: printf("Error No. 3\n");return 0;}}主程序:在主程序内,以字符串的形式输入表达式,然后分别调用函数存入各相应栈,然后用数组判断,比较运算符的优先顺序。
《数据结构与算法统计》实验报告学院:班级:学号:姓名:一、实验目的⑴熟悉VC++6.0环境,学习使用C++实现栈的存储结构;⑵通过编程、上机调试,进一步理解栈的基本概念;⑶锻炼动手编程,独立思考的能力。
二、实验内容实现简单计算器的功能,请按照四则运算加、减、乘、除、幂(^)和括号的优先关系和惯例,编写计算器程序。
要求支持运算符:+、-、*、/、%、()和=:①从键盘输入一个完整的表达式,以回车作为表达式输入结束的标志;②输入表达式中的数值均为大于等于零的整数,如果中间计算过程中出现小数也只取整进行计算。
例如,输入:4+2*5= 输出:14输入:(4+2)*(2-10)= 输出:-48三、程序设计1、概要设计为实现上述功能,应使用两个栈,分别寄存操作数和运算符。
为此需要栈的抽象数据结构。
⑴栈的抽象数据类型定义如下:ADT Stack{数据对象:D = { ai | ai ∈ElemSet, i=1,…,n,n≥0 }数据关系:R1 = { <ai-1, ai> | ai-1,ai ∈D, i=2, …,n }基本操作:InitStack1(SqStack1 &S)操作结果:创建一个空栈S,以存储运算符InitStack2(SqStack2 &S)操作结果:创建一个空栈S,以存储操作数Push1(SqStack1 &S,char e)初始条件:栈S已存在操作结果:插入运算符e作为新的栈顶元素Push2(SqStack2 &S,int e)初始条件:栈S已存在操作结果:插入操作数e作为新的栈顶元素Precede(char d,char c)初始条件:d,c为运算符操作结果:若d优先级大于c,返回>;若d优先级小于c,返回<;若d优先级等于c,返回=;GetTop1(SqStack1 &S)初始条件:栈S已存在且非空操作结果:用e返回寄存运算符栈S的栈顶元素GetTop2(SqStack2 &S)初始条件:栈S已存在且非空操作结果:用e返回寄存操作数栈S的栈顶元素Pop1(SqStack1 &S,char &e)初始条件:栈S已存在且非空操作结果:删除寄存运算符栈S的栈顶元素Pop2(SqStack2 &S,int &e)初始条件:栈S已存在且非空操作结果:删除寄存操作数栈S的栈顶元素Operate(int a,char theta,int b)初始条件:a,b为整数,theta为运算符操作结果:返回a与b运算的结果EvaluateExpression()初始条件:输入合法的表达式操作结果:返回表达式的值}ADT Stack⑵主程序流程调用EvaluateExpression()函数计算表达式的值,输出在屏幕上。
⑶各模块的调用关系先由主函数调用计算求值模块;再由求值模块调用栈构造模块,表达式转换模块及表达式求值模块,计算并返回表达式的值;最后由主函数在屏幕上输出表达式的结果。
⑷流程图2、详细设计⑴数据类型设计typedef struct SqStack1{char * base;char * top;int stacksize;}SqStack1;//定义运算符栈数据类型typedef struct SqStack2{int * base;int * top;int stacksize;}SqStack2; //定义操作数栈数据类型⑵操作算法设计int InitStack1(SqStack1 &S) //构造运算符栈{S.base=(char*)malloc(STACK_INIT_SIZE *sizeof(char));//申请存储空间if(!S.base) exit(OVERFLOW);//存储空间分配失败S.top=S.base;S.stacksize=STACK_INIT_SIZE;return 1;}int InitStack2(SqStack2 &S)//构造操作数栈{S.base=(int *)malloc(STACK_INIT_SIZE * sizeof(int));//申请存储空间if(!S.base) exit(OVERFLOW); //存储空间分配失败S.top=S.base;S.stacksize=STACK_INIT_SIZE;return 1;}char GetTop1(SqStack1 &S)//取得运算符栈栈顶元素{char e;if(S.top==S.base)//栈空{return 0;}e=*(S.top-1);return e;}int GetTop2(SqStack2 &S) //取得操作数栈栈顶元素{char e;if(S.top==S.base) //栈空{return 0;}e=*(S.top-1);return e;}int Push1(SqStack1 &S,char e)//插入元素e作为运算符栈栈顶元素{if(S.top-S.base>=S.stacksize)//栈满,追加存储空间{S.base=(char *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(char));if(!S.base)exit(OVERFLOW); //分配失败S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;}*S.top++=e;return 1;}int Push2(SqStack2 &S,int e)//插入元素e作为操作数栈栈顶元素{if(S.top-S.base>=S.stacksize) //栈满,追加存储空间{S.base=(int *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(int));if(!S.base)exit(OVERFLOW);//分配失败S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;}*S.top++=e;return 1;}int Pop1(SqStack1 &S,char &e)//删除运算符栈栈顶元素,并用e返回{if(S.top==S.base)//栈空{return 0;}--S.top;e=*S.top;return 1;}int Pop2(SqStack2 &S,int &e)//删除运算符栈栈顶元素,并用e返回{if(S.top==S.base) //栈空{return 0;}--S.top;e=*S.top;return 1;}char Precede(char d,char c)//判断d与c的优先级{switch(c){case'+':switch(d){case'+':return '>';break;case'-':return '>';break;case'*':return '>';break;case'/':return '>';break;case'^':return '>';break;case'(':return '<';break;case')':return '>';break;case'=':return '<';break;}case'-':switch(d){case'+':return '>';break;case'-':return '>';break;case'*':return '>';break;case'/':return '>';break;case'^':return '>';break;case'(':return '<';break;case')':return '>';break;case'=':return '<';break;}case'*':switch(d){case'+':return '<';break;case'-':return '<';break;case'*':return '>';break;case'/':return '>';break;case'(':return '<';break;case')':return '>';break;case'=':return '<';break;}case'/':switch(d){case'+':return '<';break;case'-':return '<';break;case'*':return '>';break;case'/':return '>';break;case'^':return '>';break;case'(':return '<';break;case')':return '>';break;case'=':return '<';break;}case'^':switch(d){case'+':return '<';break;case'-':return '<';break;case'*':return '<';break;case'/':return '<';break;case'^':return '>';break;case'(':return '<';break;case')':return '>';break;case'=':return '<';break;}case'(':switch(d){case'+':return '<';break;case'-':return '<';break;case'*':return '<';break;case'/':return '<';break;case'^':return '<';break;case'(':return '<';break;case'=':return '<';break;}case')':switch(d){case'+':return '>';break;case'-':return '>';break;case'*':return '>';break;case'/':return '>';break;case'^':return '>';break;case')':return '>';break;}case'=':switch(d){case'+':return '>';break;case'-':return '>';break;case'*':return '>';break;case'/':return '>';break;case'^':return '>';break;case')':return '>';break;case'=':return '=';break;}}}int Operate(int a,char theta,int b)//运算函数{switch(theta){case'+':return (a+b);case'-':return (a-b);case'*':return (a*b);case'/':return (a/b);case'^':return (pow(a,b));}}int EvaluateExpression()//主要运算函数{char c,d,theta,x;int num,a,b;SqStack1 OPTR;SqStack2 OPND;InitStack1(OPTR);//构造运算符栈InitStack2(OPND);//构造操作数栈Push1(OPTR,'=');c=getchar();while(c!='='||GetTop1(OPTR)!='='){num=0;if(c!='+'&&c!='-'&&c!='*'&&c!='/'&&c!='^'&&c!='('&&c!=')'&&c!='=')//不是运算符进入操作数栈{while(c!='+'&&c!='-'&&c!='*'&&c!='/'&&c!='^'&&c!='('&&c!=')'&&c!='=')//将输入的操作数的字符型转换为整型{num*=10;num+=(c-48);c=getchar();}Push2(OPND,num);}else//是运算符{d=GetTop1(OPTR);switch(Precede(d,c))//运算符优先级比较{case'<':Push1(OPTR,c);c=getchar();break;//栈顶运算符优先级低,新输入的运算符进栈case'=':Pop1(OPTR,x);c=getchar();break;//去括号case'>':Pop1(OPTR,theta);Pop2(OPND,b);Pop2(OPND,a);Push2(OPND,Operate(a,theta,b)); break;//运算,并将运算结果放入操作数栈}}}return GetTop2(OPND);//返回操作数栈栈顶元素}⑶主函数设计void main(){int result;result=EvaluateExpression();//进行计算printf("%d\n",result);//输出结果}四、程序调试分析⑴开始进行编程时,只设计了一个栈的类型,无法将运算符和操作数分开存储,在老师讲解下,问题得以解决。