哈工大数据结构线性结构及其应用

合集下载

线性结构的概念和应用

线性结构的概念和应用

线性结构的概念和应用线性结构是计算机科学中的基本数据结构之一,指的是数据元素之间存在一对一的关系,即每个数据元素都只有唯一的前驱和后继。

线性结构有几种常见的实现方式,包括链表、栈和队列。

线性结构的应用非常广泛,涵盖了各个领域的计算问题,下面就详细介绍线性结构的概念和应用。

一、概念线性结构是指数据元素之间存在一对一的关系,即每个数据元素只有唯一的前驱和后继。

常见的线性结构有链表、栈和队列。

链表是一种通过指针将数据元素连接起来的结构,每个数据元素包括数据域和指针域;栈是一种具有特殊操作规则的线性结构,只能在末尾进行插入和删除操作;队列是一种具有特殊操作规则的线性结构,只能在头部删除元素,在末尾插入元素。

线性结构还有一些常用的性质,比如长度(线性结构中元素的个数)、位置(线性结构中元素在结构中的位置)以及兄弟节点(线性结构中紧邻的两个节点)等。

二、应用线性结构在计算机科学中的应用非常广泛,以下是一些常见的应用场景。

1. 线性列表:线性结构常用来实现列表操作,例如存储一系列学生的信息、管理图书馆的藏书等。

一般情况下,可以使用链表来实现动态列表,通过插入和删除操作来实现数据的动态更新;也可以使用数组来实现静态列表,通过索引操作来访问和修改列表中的元素。

2. 栈:栈是一种非常重要的数据结构,常用来实现函数的调用、表达式求值、内存管理等。

在函数调用中,函数调用的顺序和返回地址是通过栈来维护的;在表达式求值中,运算符的优先级和操作数的运算顺序是通过栈来管理的;在内存管理中,栈被用来分配和释放函数的局部变量和临时数据。

3. 队列:队列也是一种常用的数据结构,常用来实现任务调度、消息传递等。

在任务调度中,任务被按照加入队列的顺序进行执行;在消息传递中,消息的接收顺序和处理顺序是通过队列来保证的。

4. 连接器:线性结构可以用于实现各种连接器,比如USB、HDMI等。

连接器上的插孔和插针的连接顺序和位置是线性结构的一个典型应用。

哈工大数据结构线性结构及其应用

哈工大数据结构线性结构及其应用

哈尔滨工业大学计算机科学与技术学院实验报告课程名称:数据结构课程类型:必修实验项目名称:线性结构及其应用实验题目:线性结构及其应用一、实验目的二、实验要求及实验环境三、设计思想(本程序中的用到的所有数据类型的定义,主程序的流程图及各程序模块之间的调用关系)1.逻辑设计2.物理设计四、测试结果五、系统不足与经验体会六、附录:源代码(带注释)一、实验目的输入中缀表达式保存并显示,之后转换为后缀表达式,并且求出表达式的结果。

二、实验要求及实验环境实验要求(1)从键盘输入任意一个语法正确的(中缀)表达式,显示并保存该表达式。

(2)利用栈结构,把上述(中缀)表达式转换成后缀表达式,并显示栈的状态变化过程和所得到的后缀表达式。

(3)利用栈结构,对上述后缀表达式进行求值,并显示栈的状态变化过程和最终结果。

实验环境Dev-C++软件中运行Win7系统三、设计思想本实验中定义了int 型,char型,struct 型,char *型,struct型逻辑设计:应用栈后进先出的规律,在转换为后缀表达式时,将操作运算符压入栈中,碰见更高级运算符时栈中元素出栈,继续比较;否则压栈。

这样可以完成表达式的转换。

在利用得到的后缀表达式计算结果时,将操作数压栈,遇见符号直接计算,这是后缀表达式的特点。

物理设计:建立一个结构体数组的栈,数组中存放运算符。

数组的添加和减少都在数组末尾元素进行。

可以视为一个栈。

四、测试结果样例1. 输入1+2*(3-4/2)输出为1+2*(3-4/2) ->此为保存并输出的中缀表达式12342/-*+ ->此为输出后缀表达式3 ->此为表达式的值样例2. 输入1+2*3/4-5输出为1+2*3/4-5123*4/+5--3五、系统不足与经验体会不足1.此程序只能进行整形一位数上的计算,无法实现实数范围内的计算。

2.程序用的是结构体数组来表示栈的存储结构,数组定义时,定义一段很大的空间,导致空间利用率不高。

哈工大 数据结构 实验一 线性表的实验

哈工大 数据结构 实验一 线性表的实验
n.push(w*y);
}
else if(input[i]=='/'){
y=n.pop();w=n.pop();
n.push(w/y);
}
}
cout<<n.pop()<<endl;
}
int main(){
int i,j;
double a[64];
char input[512],o;
stack<char> s;
printf("do you want to try again?(Y/N) ");
o=getchar();
if(o=='n'||o=='N') break;
getchar();printf("\n");
}
printf("thanks for using it...\n");
}
stack<double> n;
while(true){
i=0;j=0;s.null();n.null();
printf("please input the expression: ");
change(i,j,a,input,s);
printf("the answer is: ");
compute(i,j,a,input,n);
哈尔滨工业大学计算机科学与技术学院
实验报告
课程名称:数据结构与算法
课程类型:必修
实验项目名称:线性表实验
实验题目:算术表达式求值
班级:0903201
学号:1090320110
姓名:王岳

《数据结构》线性结构实验报告

《数据结构》线性结构实验报告

《数据结构》线性结构实验报告2、源程序:#include <stdio.h>#include<stdlib.h>#define MAXSIZE 1024typedef int elemtype;typedef struct SequenStack{elemtype data[MAXSIZE];int top;}SequenStack;SequenStack * Init_SequenStack(){SequenStack * S;S = (SequenStack *)malloc(sizeof(SequenStack));if (S == NULL)return S;S->top = -1;return S;}int SequenStack_Empty(SequenStack * S)//判栈空{if (S->top == -1){return 1;}{int a;printf("请以十进制输入一个数:\n");scanf_s("%d", &a);printf("转化为二进制为:");Conversion(a);printf("\n");}运行结果:3、源程序:#include<stdio.h>#include<stdlib.h>#include<string.h>typedef struct node{char data;struct node* next;}LinkStack;//初始化LinkStack* Init_LinkStack(){LinkStack* top;top = (LinkStack*)malloc(sizeof(LinkStack));top->next = NULL;return top;}//入栈void Push_LinkStack(LinkStack* top, char x){LinkStack* node;node = (LinkStack*)malloc(sizeof(LinkStack));node->data = x;node->next = top->next;top->next = node;}运行结果:4、源程序:#include <stdio.h>#include<stdlib.h>#include<string.h>#define MAXSIZE 20typedef int elemtype;typedef struct QueueNode{elemtype data;struct QueueNode* next;}LinkedQueueNode;typedef struct LQueue{LinkedQueueNode* front;LinkedQueueNode* rear;}LQueue, *LinkedQueue;typedef struct Person{char name[MAXSIZE];char sex;}Person;typedef char* ElemType;//链队初始化LinkedQueue Init_LinkedQueue(){LinkedQueue Q = (LinkedQueue)malloc(sizeof(LQueue));LinkedQueueNode * head = (LinkedQueueNode *)malloc(sizeof(LinkedQueueNode));if (head != NULL && Q != NULL){head->next = NULL;Q->front = head;Q->rear = head;printf("输入参与者的姓名,性别\n");for (i = 0; i < num; i++){printf("输入第%d个舞者的名字:\n", i + 1);scanf_s("%s", &dancer[i].name, 10);printf("输入第%d个人的性别(F/M):\n", i + 1);scanf_s("%s", &dancer[i].sex, 10);while (dancer[i].sex != 'F' && dancer[i].sex != 'M'){printf("输入错误,请重新输入第%d个人的性别(F/M):\n", i + 1);scanf_s("%s", &dancer[i].sex, 10);}}DancePartner(dancer, num);break;case 0:printf("感谢你的使用!\n");break;default:printf("无此选项!\n");break;}} while (n != 0);return 0;}运行结果:。

第4章-哈工大-数据结构-图结构及其应用算法

第4章-哈工大-数据结构-图结构及其应用算法

第4章图结构及其应用算法数据结构与算法Data Structures andgAlgorithms张岩海量数据计算研究中心哈工大计算机科学与技术学院第4章图结构及其应用算法2016/11/20Slide 4-2——图论欧拉欧拉1707年出生在瑞士的巴塞尔城,19岁开始发表论文,直到76岁。

几乎每一个数学领域都可以表论文直到76岁几乎每个数学领域都可以看到欧拉的名字,从初等几何的欧拉线,多面体的欧拉定理,立体解析几何的欧拉变换公式,四次方程的欧拉解法到数论中的欧拉函数,微分方程的欧拉方程,级数论的欧拉常数,变分学的欧拉方程,复变函数的欧拉公式等等。

据统计他那不倦的一生,共写下了886本书籍和论文,其中分析、代数、数论占40%,几何占18%,物理和力学占28%,天文学占11%,弹道学、航海学、力学占28%天文学占11%弹道学航海学建筑学等占3%。

1733年,年仅26岁的欧拉担任了彼得堡科学院学教授年到林担任科了彼得堡科学院数学教授。

1741年到柏林担任科学院物理数学所所长,直到1766年,重回彼得堡,没有多久,完全失明。

欧拉在数学上的建树很多,对著名的哥尼斯堡七桥问题的解答开创了图论的研究。

哥尼斯堡七桥问题能否从某个地方出发,穿过所有的桥仅一次后再回到出发点?学习目标图结构是一种非线性结构,反映了数据对象之间的任意关系,在计算机科学、数学和工程中有着非常广泛的应用。

了解图的定义及相关的术语,掌握图的逻辑结构及其特点;了解图的存储方法,重点掌握图的邻接矩阵和邻接表存储结构;掌握图的遍历方法,重点掌握图的遍历算法的实现;了解图的应用,重点掌握最小生成树、双连通性、强连通性、最短路径、拓扑排序和关键路径算法的基本思想、算法原理和实现过程。

本章主要内容4.1 图的基本概念4.2 图的存储结构4.3 图的遍历(搜索)4.4 最小生成树算法4.5 双连通性算法4.5双连通性算法4.6 强连通性算法4.7最短路径算法4.7 最短路径算法4.8 拓扑排序算法4.9 关键路径算法本章小结本章的知识点结构基本的数据结构(ADT)图无向图有向图加权图网络图(无向图、有向图;加权图----网络)知识点结构定义及相关术语逻辑结构及其特征ADT定义A逻辑结构静态的结构基本操作(算法)存储结构(描述)ADT基本动态的操作存储结构特点存储结构的定义ADT实现数据结构存储结构静态的结构操作(算法)实现算法的性能应用:最小生成树最短路径拓扑排序和关键路径动态的操作,,图的搜索(遍历)算法是有关图问题的重要核心算法!4.1基本定义4.1定义1 图(Graph)图是由顶点(vertex)的有穷非空集合和顶点之间边(edge)的集合组成的一种数据结构,通常表示为:G = (V,E)其中:G表示一个图,V是图G中顶点的集合,E是图G中顶点之间边的集合。

线性结构的特点线性结构的例子线性结构的应用

线性结构的特点线性结构的例子线性结构的应用
• 双链表
• 双向循环链表
空链表
• 仅有头结点,线性表中的结点都不存在。
• 结点插入操作分析
插入新结点前:
插入新结点后:
插入操作的关键语句
Tmp = new ListNode; Tmp->Element = x; Tmp->Next = Current->Next; Current->Next = Tmp;
2.2 线性表的顺序存储结构
• 线性表中结点存放在存储器上 一块连续的空间中。
• 借助存储空间的连续性,结点 可以按照其逻辑顺序依次存放。
• 逻辑相邻 物理相邻
顺序存储
顺序存储物理存储位置的计算
设第一个结点的存储地址为 LOC(a0), 余类推。设每个结
点占用 L 个单元。则:
a0
LOC(ai) = LOC(ai-1) + L
插入操作时间主要由元素移动来决定, 注意!由后向前的移动次序
线性表的顺序存储插入算法
template <class ElemType> int SeqList<ElemType>::Insert (int i, const ElemType & e) {//在位置i上插入一个值为e的结点,成功返回1。 Exception( ( i < 1) || ( i > length+1 ), ”i is not correct .”);
1. j←n 2. while (x≠A[j]) 3. j←j-1 4. end while 5. if x=A[j] then return j else return 0
查找操作的时间代价分析:
等概率下只考虑查找成功的情况 每个结点被查找的概率相同=(1/n)。 查找成功时的平均比较次数是:

线性结构及其应用


双向链表基本操作的实现
单链表的特点是任何操作都必须从表头 开始。假如要把一个链表从尾到头输出, 那效率就太低了,建立双向链表可以解决 这一问题。
循环链表基本操作的实现
利用指针实现表时,表中最后一个元素所在单元的指针 域(next)为空指针nil。如果将这个空指针改为指向表头单 元的指针就使整个链表形成一个环。.这种首尾相接的链 表称为循环链表。在循环链表中,从任意一个单元出发可 以找到表中其他单元。 (1)单向循环链表 在单链表中,将最后一个结点的指针指向头结点 (2)双向循环链表 在单向循环链表中,虽然从任一单元出发,可以找到其 前驱单元,但需要O(n)时间。如果将双链表中最后一个结 点的指针指向头结点,且头结点的前趋指向最后一个结点, 这样就构成了双向循环链表
ቤተ መጻሕፍቲ ባይዱ
线性表基本操作的实现
单链表基本操作的实现 (5)判断链表是否为空(emplkst(head)) function emplkst(head:link):boolean; begin if head^.Next=nil then emplkst:=true else emplkst:=false end; (6)查找 ①按序号查找。 ②按值查找。 read(ch); P:=head; while(p<>nil)and(p^.data<>ch)do P:=P^.next; if p<>nil then write(’ok’) else write(‘sorry‘);
线性表的存储结构
链接存储结构:用指针类型来描述 单链表: Type datatype={ datatype={单链表中结点的数据类型} } link=^node; node=record data:dataty; next:link end;

哈尔滨工程大学-考研数据结构真题-6

第5页 共6页2.通常使用队列来处理函数或过程的调用。

( ) 3.数组不适合作为任何二叉树的存储结构。

( )4.一棵一般树的结点的前序遍历和后序遍历分别与它相应二叉树的结点前序遍历和后序遍历是一致的。

( ) 5.必须把一般树转换成二叉树后才能进行存储。

( )6.无向图的邻接矩阵一定是对称矩阵,有向图的邻接矩阵一定是非对称矩阵。

( ) 7.在二叉树排序树中插入一个新结点,总是插入到叶结点下面。

( )8.采用线性探测法处理散列时的冲突,当从哈希表删除一个记录时,不应将这个记录的所在位置置空,因为这会影响以后的查找。

( )9.当待排序记录已经从小到大排序或者已经从大到小排序时,快速排序的执行时间最省。

( )10.快速排序的速度在所有排序方法中为最快,而且所需附加空间也最少。

( ) 四、应用题(每题5分,共30分)1.对字符序列{t,d,e,s,u,g,b,j,a,k,r,i},构成一棵平衡二叉(排序)树,并为每一次的平衡处理指明旋转类型。

(要求画出建树过程)2.设有一组关键字{1,13,12,34,38,33,27,22},采用哈希函数H (key )= key mod 11和线性探测再散列法解决冲突,对该关键字序列构造表长为11哈希表。

3.给出一组关键字{12,2,16,30,8,28,4,10,20,6,18},写出用下列算法从小到大排序时第一趟结束时的序列:⑴ 希尔排序(第一趟排序的增量为5) ⑵ 快速排序(选第一个记录为枢轴)4.假定用于通讯的电文仅由8个字母C1、C2、C3、C4、C5、C6、C7、C8组成,各个字母在电文中出现的频率分别为0.05、0.25、0.03、0.06、0.10、0.11、0.36、0.04,试为这8个字母设计哈夫曼编码。

线性结构应用实验报告(3篇)

第1篇一、实验目的1. 掌握线性结构的基本概念和特点;2. 熟悉线性结构的应用场景;3. 掌握线性结构在数据存储和处理中的优势;4. 能够运用线性结构解决实际问题。

二、实验内容本次实验主要针对线性结构进行应用,通过实现一个简单的学生信息管理系统,演示线性结构在实际问题中的应用。

三、实验环境1. 操作系统:Windows 102. 编程语言:C++3. 开发工具:Visual Studio 2019四、实验原理线性结构是一种基本的数据结构,它具有以下特点:1. 有且仅有一个根节点;2. 每个节点最多有一个前件节点和一个后件节点;3. 线性结构中的节点是有序的。

线性结构在数据存储和处理中具有以下优势:1. 便于实现插入和删除操作;2. 线性查找效率较高;3. 便于实现排序和遍历等操作。

五、实验步骤1. 定义学生信息结构体;2. 实现学生信息链表的创建、插入、删除、查找、排序和遍历等操作;3. 实现学生信息管理系统功能;4. 编写主函数,测试实验功能。

六、实验代码1. 学生信息结构体定义:```cppstruct Student {int id; // 学号string name; // 姓名int age; // 年龄float score; // 成绩Student next; // 指向下一个节点的指针};```2. 学生信息链表创建:```cppStudent createStudentList() {Student head = nullptr; // 创建头节点Student tail = nullptr; // 创建尾节点// 创建学生信息Student newStudent = new Student;newStudent->id = 1;newStudent->name = "张三";newStudent->score = 90.0;head = newStudent;tail = newStudent;// 创建更多学生信息newStudent = new Student;newStudent->id = 2;newStudent->name = "李四";newStudent->age = 21;newStudent->score = 85.0;tail->next = newStudent;tail = newStudent;// 返回链表头节点return head;}```3. 学生信息链表插入:```cppvoid insertStudent(Student head, Student newStudent) { if (head == nullptr) {head = newStudent;return;}while (current->next != nullptr) {current = current->next;}current->next = newStudent;}```4. 学生信息链表删除:```cppvoid deleteStudent(Student head, int id) {if (head == nullptr) {return;}Student current = head;Student prev = nullptr;while (current != nullptr && current->id != id) { prev = current;current = current->next;}if (current == nullptr) {return;}if (prev == nullptr) {head = current->next;} else {prev->next = current->next;}delete current;}```5. 学生信息链表查找:```cppStudent findStudent(Student head, int id) {Student current = head;while (current != nullptr && current->id != id) { current = current->next;}return current;}```6. 学生信息链表排序:```cppvoid sortStudentList(Student head) {if (head == nullptr || head->next == nullptr) { return;}Student sorted = nullptr;Student current = head;while (current != nullptr) {Student next = current->next;Student temp = sorted;while (temp != nullptr && temp->score >= current->score) { temp = temp->next;}current->next = temp;if (temp == nullptr) {sorted = current;} else {temp->next = current;}current = next;}head = sorted;}```7. 学生信息链表遍历:```cppvoid traverseStudentList(Student head) {Student current = head;while (current != nullptr) {cout << "学号:" << current->id << " 姓名:" << current->name << " 年龄:" << current->age << " 成绩:" << current->score << endl;current = current->next;}}```8. 学生信息管理系统功能实现:```cppvoid studentManagementSystem() {Student head = createStudentList();int choice;do {cout << "1. 添加学生信息" << endl;cout << "2. 删除学生信息" << endl;cout << "3. 查找学生信息" << endl;cout << "4. 显示所有学生信息" << endl;cout << "5. 退出" << endl;cout << "请选择操作:";cin >> choice;switch (choice) {case 1:// 添加学生信息break;case 2:// 删除学生信息break;case 3:// 查找学生信息break;case 4:// 显示所有学生信息traverseStudentList(head);break;case 5:// 退出break;default:cout << "无效操作,请重新选择!" << endl; }} while (choice != 5);}```9. 主函数:```cppint main() {studentManagementSystem();return 0;}```七、实验结果与分析通过本次实验,我们成功实现了学生信息管理系统,演示了线性结构在实际问题中的应用。

哈工大854数据结构大纲

哈工大854数据结构大纲
哈工大854数据结构课程的大纲主要包括以下内容:
1. 数据结构基础概念,介绍数据结构的基本概念、术语和基本
操作,包括数据的存储方式、数据的逻辑结构和物理结构等。

2. 线性表,介绍线性表的定义、基本操作和实现方式,包括顺
序表、链表和线性表的应用。

3. 栈和队列,介绍栈和队列的定义、基本操作和实现方式,包
括顺序栈、链式栈、顺序队列、链式队列和栈和队列的应用。

4. 树和二叉树,介绍树和二叉树的定义、基本操作和实现方式,包括二叉树的遍历、线索二叉树、树和二叉树的应用。

5. 图,介绍图的定义、基本操作和实现方式,包括图的遍历、
最小生成树、最短路径和图的应用。

6. 查找,介绍查找的基本概念和常用的查找算法,包括顺序查找、二分查找、哈希查找和查找的应用。

7. 排序,介绍排序的基本概念和常用的排序算法,包括插入排序、选择排序、冒泡排序、快速排序、归并排序和排序的应用。

8. 动态存储管理,介绍动态存储管理的基本概念和常用的存储
管理算法,包括分配与回收、内存碎片整理和动态存储管理的应用。

9. 高级数据结构,介绍高级数据结构的概念和应用,包括平衡
二叉树、B树、红黑树、哈希表和高级数据结构的应用。

以上是哈工大854数据结构课程大纲的主要内容。

通过学习这
些内容,学生可以掌握数据结构的基本概念、常用数据结构的实现
方式和操作方法,以及数据结构在实际问题中的应用。

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

哈尔滨工业大学计算机科学与技术学院实验报告课程名称:数据结构课程类型:必修实验项目名称:线性结构及其应用实验题目:线性结构及其应用一、实验目的二、实验要求及实验环境三、设计思想(本程序中的用到的所有数据类型的定义,主程序的流程图及各程序模块之间的调用关系)1.逻辑设计2.物理设计四、测试结果五、系统不足与经验体会六、附录:源代码(带注释)一、实验目的输入中缀表达式保存并显示,之后转换为后缀表达式,并且求出表达式的结果。

二、实验要求及实验环境实验要求(1)从键盘输入任意一个语法正确的(中缀)表达式,显示并保存该表达式。

(2)利用栈结构,把上述(中缀)表达式转换成后缀表达式,并显示栈的状态变化过程和所得到的后缀表达式。

(3)利用栈结构,对上述后缀表达式进行求值,并显示栈的状态变化过程和最终结果。

实验环境Dev-C++软件中运行Win7系统三、设计思想本实验中定义了int 型,char型,struct 型,char *型,struct型逻辑设计:应用栈后进先出的规律,在转换为后缀表达式时,将操作运算符压入栈中,碰见更高级运算符时栈中元素出栈,继续比较;否则压栈。

这样可以完成表达式的转换。

在利用得到的后缀表达式计算结果时,将操作数压栈,遇见符号直接计算,这是后缀表达式的特点。

物理设计:建立一个结构体数组的栈,数组中存放运算符。

数组的添加和减少都在数组末尾元素进行。

可以视为一个栈。

四、测试结果样例1. 输入1+2*(3-4/2)输出为1+2*(3-4/2) ->此为保存并输出的中缀表达式12342/-*+ ->此为输出后缀表达式3 ->此为表达式的值样例2. 输入1+2*3/4-5输出为1+2*3/4-5123*4/+5--3五、系统不足与经验体会不足1.此程序只能进行整形一位数上的计算,无法实现实数范围内的计算。

2.程序用的是结构体数组来表示栈的存储结构,数组定义时,定义一段很大的空间,导致空间利用率不高。

经验体会1.建立算法框架时如中缀表达式变后缀表达式,后缀表达式的求值时,需要用到很多的函数来搭建。

这个可以先放下,先将该算法编好,完成之后再将所需要的函数填补起来。

这样可以简化步骤。

2.算法分模块解决,不把所有算法堆到一个函数里面。

这样可以使程序简洁明了,各个函数的分工明确。

易于调试差错。

六、附录:源代码(带注释)#include<stdio.h>#include<stdlib.h>#define MAX 100 //定义栈中最多有100个元素/*创建结构体,结构体中含有两个量,一个数组栈,一个指向栈顶元素*/ typedef struct{int data[MAX]; //定义数组栈int top; //栈顶标号}seqstack,*pseqstack;/*创建一个顺序栈,入口无参数,返回一个指向顺序栈的指针*/pseqstack init_seqstack(){pseqstack s;s=(pseqstack)malloc(sizeof(seqstack)); //申请栈的内存空间 if(s)s->top=-1; //创建新栈时栈顶指针指向-1return s;}/*判断栈是否为空,返回1表示空,0表示非空*/int empty_seqstack(pseqstack s){if(s->top==-1) //判断条件为top指针是否指向-1return 1;elsereturn 0;}/*入栈:栈顶插入x*/int push_seqstack(pseqstack s,int x){if(s->top==MAX-1)return 0; //栈已满,返回0else{s->top++; //栈顶指针+1,指向将要压栈的xs->data[s->top]=x;return 1;}}/*出栈:入口参数为s,*x。

删除栈顶元素,并且保存在*x中*/int pop_seqstack(pseqstack s,char *x)if(empty_seqstack(s))return 0;else{*x=s->data[s->top];s->top--;return 1;}}/*销毁栈*/void destroy_seqstack(pseqstack *s){if(*s)free(*s);*s=NULL;}/*判断字符是否为操作数;是返回1,否则为0*/int isnum(char c){if(c>='0'&&c<='9')return 1; //若字符常量的值小于等于‘9’大于等于‘0’则为操作数,并返回1 elsereturn 0;}/*求算符的优先级,入口参数为字符op*/int priority(char op){switch(op){case '\0': return (0);case ')': return (1);case '+': return (2);case '-': return (2);case '*': return (3);case '/': return (3);case '(': return (4);default: return (5);//定义各个支付对应的优先级}/*中缀表达式转换成后缀表达式,入口参数字符指针*in,*post*///*post中存入后缀表达式void change(char *in,char *post){pseqstack s;char c,w,y;int z1,z2;s=init_seqstack();if(!s){printf("initial fault");} //栈初始化失败输出initial fault push_seqstack(s,'\0'); /*转换之前将栈底存入‘\0’,标记作用,便于判断循环中是否到栈底*/w=*in; //w存入中缀表达式中第一个元素while(s->data[s->top]!='\0'||w!='\0') /*当s栈栈底元素不为‘\0’或者w不为‘\0’(w为\0时表示中缀表达式已经读完)时循环*/{if(isnum(w)){*post=w;post++;w=*(++in);} /*判断w是操作数时,将w赋给*post,并且指针post++,w中值被赋为*in中下一个元素*///w不是操作数时else{if(s->data[s->top]=='('&&w==')'){pop_seqstack(s,&y);w=*(++in);}/*栈顶为‘(‘且w为’)‘时栈顶元素出栈,但出栈元素’(‘不存入*post,w中值被赋为*in 中下一个元素*/else{/*比较栈顶元素与w运算符的优先级大小,若栈顶优先级更小,则w入栈否则栈顶出栈,并将出栈元素赋给*post,post++ */if(s->data[s->top]=='('||priority(s->data[s->top])<priority(w)) {push_seqstack(s,w);w=*(++in);}else{pop_seqstack(s,&y);*post=y;post++;}}}}*post='\0'; //字符串最后添加‘\0‘表示字符串终止destroy_seqstack(&s); //销毁栈}/*后缀表达式求值,入口参数为字符指针*b,其中存储了后缀表达式*/void result(char *b){pseqstack s;char ch,a,c,d,result;ch=*b++;s=init_seqstack();//循环在后缀表达式到结尾‘\0‘时终止while(ch!='\0'){if(isnum(ch)){push_seqstack(s,ch-'0');}//若ch 为操作数则存入栈中,否则进行运算else{pop_seqstack(s,&a);pop_seqstack(s,&c); //栈中最上方的两个数出栈计算switch(ch) //各种条件下的运算{case '+': d=a+c; break;case '-': d=c-a; break;case '*': d=a*c; break;case '/': d=c/a; break;}push_seqstack(s,d); //运算后的结果再压入栈中 }ch=*b++;}//循环完成后栈顶元素就是表达式最后的值,输出该值printf("%d",s->data[s->top]);destroy_seqstack(&s);}/*主函数*/int main(){int x,y;char a[MAX],b[MAX];gets(a); //输入中缀表达式,并且存入字符数组a[MAX]中puts(a); //输出保存得到的中缀表达式change(a,b); //调用函数得到后缀表达式puts(b); //输出后缀表达式result(b); //调用函数计算表达式的值,并输出该值getchar();getchar();return 0;}。

相关文档
最新文档