中缀表达式求值
c++ 中缀表达式
c++ 中缀表达式
C++ 中缀表达式(Infix Expression)是指运算符位于操作数之
间的表达式,例如:a + b * c。
在C++中,中缀表达式的求值需要遵循运算符的优先级和结
合性规则。一般来说,乘法、除法、取模运算的优先级最高,加法、减法运算的优先级较低。
在编写C++程序时,为了正确求解中缀表达式,可以使用以
下方法之一:
1. 使用栈进行中缀表达式的转换和求解。
2. 使用递归函数或逆波兰表达式将中缀表达式转换成后缀表达式,然后使用栈进行后缀表达式的求解。
例如,给定中缀表达式 a + b * c,可以使用栈的方法求解:
1. 创建一个空栈用于存储运算符和操作数。
2. 遍历中缀表达式的每个字符,按以下规则处理:
- 如果遇到操作数,则将其压入栈中。
- 如果遇到运算符,则根据其优先级和结合性,判断是否需
要将运算符从栈中弹出并进行运算。然后将运算结果压入栈中。 - 如果遇到左括号,则直接将其压入栈中。
- 如果遇到右括号,则取出栈中的运算符和操作数,直到遇
到左括号为止,并进行相应的运算。最后将运算结果压入栈中。
3. 遍历完中缀表达式后,栈中最后一个元素即为表达式的结果。
注:以上只是一种求解中缀表达式的方法,实际求解方法可能有其他的实现方式。
c语言计算中缀表达式
c语言计算中缀表达式
计算中缀表达式是一种常见的数学计算方法,它使用操作符位于操作数之间的形式来表示数学表达式。在C语言中,计算中缀表达式需要使用算术运算符和括号来确定运算的优先级和顺序。
以下是一个关于如何计算中缀表达式的详细步骤:
1. 创建一个空的操作数栈和操作符栈。
2. 从左到右遍历中缀表达式的每个字符。
3. 如果当前字符是操作数(数字),则将其压入操作数栈中。
4. 如果当前字符是操作符,则执行以下操作:
a. 如果操作符栈为空,或者栈顶操作符为左括号"(",则将当前操作符压入操作符栈中。
b. 如果当前操作符的优先级高于栈顶操作符的优先级,则将当前操作符压入操作符栈中。
c. 如果当前操作符的优先级低于或等于栈顶操作符的优先级,则从操作符栈中弹出一个操作符,从操作数栈中弹出两个操作数,进行计算,并将结果压入操作数栈中。然后将当前操作符压入操作符栈中。
d. 如果当前操作符为右括号")",则从操作符栈中弹出操作符,从操作数栈中弹出两个操作数,进行计算,并将结果压入操作数栈中,直到遇到左括号"("为止。
5. 遍历完中缀表达式后,从操作符栈中依次弹出操作符,从操作数栈中弹出两个操作数,进行计算,并将结果压入操作数栈中,直到操作符栈为空。
6. 最后,操作数栈中的唯一元素即为最终计算结果。
下面是一个示例,演示如何计算中缀表达式 "3 + 4 * 2 / ( 1 - 5 ) ^ 2 ^ 3":
1. 创建一个空的操作数栈和操作符栈。
2. 从左到右遍历中缀表达式的每个字符。
a. 遇到数字3,将其压入操作数栈中。
计算中缀表达式
计算中缀表达式
计算中缀表达式
中缀表达式是一种常见的算术表达式,例如 3+4*5,表示3加4乘以5。在计算机中,中缀表达式需要转化为后缀表达式或者前缀表达式才能进行计算。本文讨论如何计算中缀表达式。
1. 中缀表达式的运算规则
中缀表达式的运算规则和我们平时计算算式的规则一样。运算符有加(+)、减(-)、乘(*)、除(/)和求幂(^)等操作符,运算符之间的优先级规则如下:
1) 求幂(^)具有最高优先级;
2) 乘(*)和除(/)的优先级次于求幂(^);
3) 加(+)和减(-)的优先级最低。
如果有多个同级别的运算符,规定一般从左到右进行计算。
在计算中缀表达式时,还需要遵循括号匹配的规则,优先计算括号内的运算。
2. 中缀表达式的计算过程
计算中缀表达式需要转换为后缀表达式或者前缀表达式。因为中缀表达式的运算符优先级和括号使得计算过程不再是线性的,需要借助栈数据结构以及转换算法。
2.1 中缀表达式转换为后缀表达式
后缀表达式也称为逆波兰表达式(RPN),中缀表达式转换为后缀表达式的算法如下:
1) 建立一个运算符栈S,然后从左到右遍历中缀表达式;
2) 遇到数字,直接输出到输出字符串;
3) 遇到左括号,将其压入运算符栈S中;
4) 遇到右括号,将栈顶的运算符弹出,直到遇到左括号,左右括号同时丢弃;
5) 遇到运算符,比较其与栈顶运算符的优先级:
a) 如果该运算符优先级高于栈顶运算符,则将运算符压入栈顶; b) 否则将栈顶运算符弹出,直到遇到优先级低于该运算符的运算符,将该运算符压入栈顶。
6) 如果表达式已经扫描完毕,将栈中剩余的运算符依次输出到输出字符串中。
字符串表达式求值(支持多种类型运算符)
字符串表达式求值(⽀持多种类型运算符)
⼀、说明
1. 输⼊字符串为中缀表达式,⽆需转为后缀表达式
2. ⽀持的运算符包括:
算术运算符:"+,-,*,/"
关系运算符:">,<,>=,<=,=,!="(注意等于运算符采⽤的是⼀个等号)
逻辑运算符:"&&,||"
3. ⽀持⼤于10的数字,不⽀持负数操作数,但⽀持中间结果和返回值为负数
⼆、算法原理&步骤
本⽂算法对中缀表达式形式字符串进⾏求值,同时⽀持与或运算和逻辑运算(若含有关系运算符或者逻辑运算符,则输出为1或者0)。类似于加减乘除,将关系运算符和逻辑运算符看作优先级低的运算符进⾏处理,优先级:算术运算符>关系运算符>逻辑运算符。
步骤:
1. 初始化两个空堆栈,⼀个存放操作数,⼀个存放运算符。
2. 从左⾄右扫描输⼊字符串,依次读取。
2.1 若为操作数,则压⼊操作数栈;
2.2 若为运算符,判断其优先级是否⼤于运算符栈栈顶元素优先级。若⼤于栈顶元素优先级,则直接压栈;否则,弹出栈顶元素operator,同时
依次从操作数栈中弹出两个元素number1,number2,计算表达式(number2 operator number1)的值value,并将值value压⼊操作数栈。重复上述过程直⾄当前扫描的操作符优先级⼤于栈顶元素,然后将当前运算符压栈。
3. 弹出运算符栈顶元素operator,同时依次从操作数栈中弹出两个元素number1,number2,计算表达式(number2 operator number1)的值value,并将值value压⼊操作数栈。重复上述过程直⾄运算符栈为空。
中缀表达式求值实验报告
top=p;
break;
}
case'-':
{
a=x-y;
p=(struct node *)malloc(sizeof(struct node));p->num=a;
p->next=top;
top=p;
break;
}
case'*':
{
a=x*y;
p=(struct node *)malloc(sizeof(struct node));
用以区分前后两个数字,如 12+45*,如果直接存入字符串中会是s2:1245*+; 但加空格后为s2:12 (空格)45*+;这样后面运算时就好区分两多位数字。
2.心得体会
在写程序之前要选择适合自己的算法即自己熟悉的能编出的算法,这样后 续的编程会简便多了。
对于一个要实现的功能,会有很多不同的算法,当你一个算法用不了时, 可以换一个算法编程,目的是死的,人是活的,算法是活的,程序也是活的!
p=(struct node *)malloc(sizeof(struct node));p->num=a;
p->next=top;
top=p;
i=n-1;
}
else if(s2[i]==';')〃遇;号结束标志,输出栈中的最后计算结果
C++程序代码-中缀表达式求值
while(!optrS.Empty())//清空运算符栈
{
optr2=optrS.Pop();
if(optr2.op=='(')
Error("Missing right parenthesis");
Evaluate(opndS,optr2);
}
cout<<"The value is "<<opndS.Pop()<<endl;//显示结果
rank--;
if(rank<0)
Error("Operand expected");
optr1=MathOperator(ch);
while(!optrS.Empty()&&optrS.Top()>=optr1)
{
optr2=optrS.Pop();
Evaluate(opndS,optr2);
}
optrS.Push(optr1);
}
void Error(char *c)
{
cerr<<c<<endl;
exit(1);
}
//从操作数栈Opnds取出两个数,进行运算符optr指定的计算,然后将结果压回操作数栈
中缀表达式变后缀表达式、后缀表达式(逆波兰)求值(python版本)
中缀表达式变后缀表达式、后缀表达式(逆波兰)求值
(python版本)
定义:
中缀表达式:在通常的表达式中,⼆元运算符总是置于与之相关的两个运算对象之间,这种表⽰法也称为中缀表达式
后缀表达式:⼜叫逆波兰表达式,不包含括号,放在两个运算对象的后⾯,所有的计算按运算符出现的顺序,严格从左向右进⾏(不再考虑运算符的优先规则,如:(2 + 1) * 3 ,即2 1 + 3 *
⼀个字符串表达式s = “9 + ( 3 - 1 ) * 3 + 10 / 2”)求值的过程分为两步
(⼀) 将中缀表达式s变为后缀表达式s_after = "9 3 1 - 3 * + 10 2 / +",具体的规则如下:
⾸先维护两个空栈,(stack_exp)存放逆波兰表达式,(stack_ops)暂存操作符,运算结束后stack_ops必为空
循环遍历字符串(将表达式分为四种元素 1、数值; 2、操作符; 3、左括号; 4、右括号),具体情况如下
1、遇到数值,将该值⼊栈stack_exp
2、遇到左括号,将左括号⼊栈stack_ops
3、遇到右括号,将stack_ops中的操作符从栈顶依次出栈并⼊栈stack_exp,直到第⼀次遇到左括号终⽌操作(注意:该左括号出栈stack_ops但不⼊栈stack_exp)⾄此消除表达式中的⼀对括号
4、遇到四则运算操作符号(+ - * /)
4-1、如果stack_ops为空,操作符⼊栈stack_ops
4-2、如果stack_ops不空,将stack_ops栈顶操作符与遍历到的操作符(op)⽐较:
c语言实现中缀表达式的计算
c语言实现中缀表达式的计算
C语言实现中缀表达式的计算
一、前言
在计算机科学领域,中缀表达式是最容易理解的数学表达式,也是人
们最常用的表达方式。但对于计算机而言,中缀表达式并不方便计算。因此,在进行表达式计算时,需要将中缀表达式转化为其它形式,例
如前缀表达式和后缀表达式。在本篇文章里,我们将介绍如何使用C
语言实现中缀表达式的计算。
二、中缀表达式的转换
在C语言中,实现中缀表达式的计算,通常需要先将中缀表达式转换
为后缀表达式。中缀表达式的转换过程主要分为以下三个步骤:
1. 初始化一个栈,存储操作符。
2. 遍历中缀表达式,根据操作符的运算优先级将其从中缀表达式转化
为后缀表达式。
3. 根据后缀表达式,使用栈实现表达式的计算。
其中,第二步是最关键的一个步骤。我们可以通过以下方法进行转换:
1. 将操作数直接输出。
2. 如果遇到运算符,先将栈中所有优先级大于等于该运算符的操作符
弹出,再将该运算符入栈。
3. 如果遇到左括号,直接入栈。
4. 如果遇到右括号,将栈中的元素一直弹出到遇到左括号为止。
例如,对于中缀表达式2 + 3 * 4 - 5,转换为后缀表达式的过程如下所示:
中缀表达式:2 + 3 * 4 - 5
转换为后缀表达式:2 3 4 * + 5 -
三、代码实现
现在,我们已经掌握了中缀表达式的转换方法,接下来,我们就可以实现C语言代码了。具体实现如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义运算符栈
数据结构课程设计四则运算表达式求值(C语言版)
数据结构课程设计四则运算表达式求值(C语⾔版)
明⼈不说暗话,直接上,输⼊提取码z3fy即可下载。
⽂件中包含程序,程序运⾏⽂件,设计报告和测试样例,应有尽有,欢迎⼩伙伴们在中下载使⽤。
本课程设计为四则运算表达式求值,⽤于带⼩括号的⼀定范围内正负数的四则运算标准(中缀)表达式的求值。
注意事项:
1、请保证输⼊的四则表达式的合法性。输⼊的中缀表达式中只能含有英⽂符号“+”、“-”、“*”、“/”、“(”、“)”、“=”、数字“0”到“9”以及⼩数
点“.”,输⼊“=”表⽰输⼊结束。例如9+(3-1)*3.567+10/2=,特别是请勿输⼊多余空格和中⽂左右括号。
2、输⼊的中缀表达式默认限定长度是1001,可根据具体情况调整字符串数组的长度。
3、请保证输⼊的操作数在double数据类型范围内,单个数字有效数字长度不可超过15位。本课程设计中操作数是C语⾔中的双精度浮点数类型。
4、本课程设计中的运算数可以是负数,另外如果是正数可直接省略“+”号(也可带“+”号)。
下⾯的程序正常运⾏需要在上⾯的百度⽹盘中下载相应⽂件,否则⽆法正常使⽤哦。
1/*本程序为四则运算表达式求值系统,⽤于计算带⼩括号的四则运算表达式求值。
2具体算法:
3先将字符串处理成操作单元(操作数或操作符),再利⽤栈根据四则运算
4的运算法则进⾏计算,最后得出结果。*/
5
6 #include<stdio.h>
7 #include<ctype.h>
8 #include<stdlib.h>
9 #include<string.h>
数据结构表达式求值(中缀)实验报告
数据结构表达式求值(中缀)实验报告题目名称表达式求值学号姓名指导教师日期
一
1. 问题描述:在计算机中,算术表达式由常量、变量、运算符和括号组成。由于不同的运
算符具有不同的优先级,又要考虑括号,因此,算术表达式的求值不可能严格地从
左到右进行,在程序设计时,借助栈实现。
2. 表达式求值这个程序,主要利用栈和数组,把运算的先后步骤进行分析并实现简单
的运算,以字符列的形式从终端输入语法的正确的、不含变量的整数表达式。
利用已知的算符优先关系,实现对算术四则运算的求值,在求值中运用栈、运算栈、输入字符和主要操作的变化过程。该程序相当于一个简单的计算机计算程序,只进行简单的加减乘除和带括号的四则运算。
1、基本思想(中缀表达式求值)
要把一个表达式翻译成正确求值的一个机器指令序列,或者直接对表达式求值,首先要能够
正确解释表达式,要了解算术四则运算的规则即:
(1)先乘除后加减;
(2)从左到右计算;
(3)先括号内,后括号外。
下表定义的运算符之间的关系:
b + - * / () # a
+ > > < < < > > _ > > < < < > > * > > > > < > > / > > > > < > > ( < < < < < = ) > > > > > > # < < < < < =
中缀表达式求值(C++实现)
中缀表达式求值(C++实现)当初的数据结构上机作业,题⽬很奇葩,要求先将中缀表达式转换成后缀表达式再求值。
只加⼊了⼀些错误判断,因为输⼊的错误形式太多了,做到⼀半懒得做了。
代码:
展开
1// 中缀表达式求值(通过先转换为后缀表达式再求值)
2// 作者:王锦
3// 邮箱:jinksw@
4
5 #include "stdafx.h"
6 #include <stack>
7 #include <queue>
8 #include <iostream>
9 #include <sstream>
10using namespace std;
11
12class IEcalculator//中缀表达式求值
13 {
14private:
15 stack<double> s;
16 queue<string> suffixE;//⽤于存储后缀表达式序列
17 stack<char> operatorStack;
18bool flag;//⽤于记录是否发⽣错误,避免不必要的计算
19bool aIsNotLessThenB(char a,char b);//⽤于判断a的优先级是否⼤于等于b
20bool getTwoOperands(double &opd1,double &opd2);
21bool compute(char op);
22void clear()//清除栈中元素
23 {
24while(!s.empty())
25 s.pop();
中缀表达式值
中缀表达式值
的求解方法。
中缀表达式值的求解方法
中缀表达式是我们常见的数学表达式形式,如 3 + 4.2×(8-5),但是对于计算机而言,更容易处理的是后缀表达式或前缀表达式,因此我们需要将中缀表达式转换成后缀表达式或前缀表达式,再进行计算。而将中缀表达式转换成后缀表达式或前缀表达式的过程,就称为表达式的转换。
本文将介绍两种方法,一种是使用栈的方法,另一种是使用递归的方法。无论哪种方法,我们首先需要了解中缀表达式中的运算符的优先级和结合性。
运算符的优先级和结合性
在中缀表达式中,我们常见的运算符有加减乘除、括号等,它们的优先级和结合性如下:
运算符 | 优先级 | 结合性
:--------:|:------:|:------:
( ) | 无 | 左结合
+ - | 1 | 左结合
× ÷ | 2 | 左结合
其中,优先级数字越大,优先级越高。左结合表示从左往右计算,右结合表示从右往左计算。
使用栈的方法
栈是一种后进先出的数据结构,对于中缀表达式的转换,我们可以使用栈来存
储运算符。具体过程如下:
1. 创建两个栈,一个用来存储运算符,一个用来存储中间结果;
2. 从左到右遍历中缀表达式中的每一个元素;
3. 如果是数字,则直接压入中间结果栈;
4. 如果是运算符,则判断与运算符栈栈顶元素的优先级,如果优先级较高,则
直接入栈;如果优先级较低,则将运算符栈中优先级较高的运算符弹出,压入中间结果栈,直到优先级相等或者运算符栈为空,再将该运算符压入运算符栈;
5. 如果是左括号,则直接压入运算符栈;
6. 如果是右括号,则将运算符栈中从左到右第一个左括号上面的运算符全部弹出,压入中间结果栈,将左括号弹出丢弃;
中缀表达式计算、
中缀表达式计算、
(实用版)
目录
1.中缀表达式的概念
2.中缀表达式的计算方法
3.中缀表达式的应用实例
正文
一、中缀表达式的概念
中缀表达式(Infix Expression),又称作中缀代数表示,是一种将运算符和操作数混合排列的表达式。它是一种用于表示算术运算的记法,其中运算符出现在操作数之间。与常见的前缀表达式(Postfix Expression)和后缀表达式(Reverse Polish Notation,简称 RPN)不同,中缀表达式的运算顺序取决于运算符的优先级和结合性。
二、中缀表达式的计算方法
中缀表达式的计算过程需要通过一定的转换将其转换为可以被计算
机直接执行的形式。常见的计算方法有以下两种:
1.栈算法
栈算法是一种基于栈的数据结构,可以用来解决中缀表达式的计算问题。该算法的基本思想是使用一个栈来存储中缀表达式中的操作数,当遇到运算符时,根据栈顶元素的类型进行相应的操作。具体来说,可以将中缀表达式转换为后缀表达式,然后使用栈来计算后缀表达式的值。
2.直接计算法
直接计算法是一种直接根据运算符的优先级和结合性计算中缀表达
式的值的方法。该方法需要先确定运算符的优先级,然后从左到右扫描表达式,根据优先级和结合性进行相应的计算。这种方法相对简单,但对于
复杂的表达式计算效率较低。
三、中缀表达式的应用实例
中缀表达式在计算机科学中有广泛的应用,例如:
1.表达式求值:通过中缀表达式计算方法,可以实现对复杂数学表达式的求值。
2.编译器:编译器在将高级编程语言转换为机器语言时,需要对表达式进行求值。中缀表达式作为一种表达式表示方法,可以在编译器中得到应用。
中缀、前缀、后缀表达式的运算
中缀、前缀、后缀表达式的运算
中缀表达式,就是在表达式中,操作符在操作数的中间,⽐如 (1+2)*3,+和*在1, 2, 3的中间。前缀表达式,就是操作符在操作数的前⾯,⽐如 +12,+在1, 2的前⾯。后缀表达式,就是操作符在操作数的后⾯,⽐如 12+,+在1, 2的后⾯。为什么会有这么多表达式呢?它们⽬的不同。中缀表达式,便于我们书写,也符合我们的阅读习惯,在计算机程序中,都是写中缀表达式,但它却不利于计算机进⾏算术计算,因为涉及到优先级和括号。前缀表达式和后缀表达式中没有括号,并且运算符的优先级也通过它们在表达式中的顺序体现出来了,有利于计算机进⾏算术运算。前缀表达式也叫波兰表达式,因为它是由⼀个波兰⼈发明的,相应的,后缀表达式也称为逆波兰表达式。举个例⼦来说明⼀下三者的运算过程,假设计算(3+4)*5-6
使⽤中缀表达式进⾏计算
1,创建两个栈,⼀个是数字栈,⽤来存放操作数,⼀个是字符栈,⽤来存放操作符。
2,算术表达式是⼀个字符串,从左到右循环遍历表达式,依次取出每⼀个字符。
当取出的字符是操作数时,⼊数字栈。
当取出的字符是操作符时,这时还要看操作符的优先级和字符栈是否为空
如果字符栈为空,直接把取出的字符放⼊到字符栈中。
如果字符栈不为空,则要⽐较字符的优先级
如果取出的字符的优先级⼤于等于字符栈中栈顶的字符的优先级,直接把取出的字符放⼊到字符栈中。
如果取出的字符的优先级⽐字符栈中栈顶的字符的优先级低,则要循环进⾏如下操作,直到取出的字符的优先级⼤于等于字符栈中栈顶字符的优先级或者栈为空,此时,把取出的字符放⼊到字
基于栈的中缀算术表达式求值
基于栈的中缀算术表达式求值
描述
输⼊⼀个中缀算术表达式,求解表达式的值。运算符包括+、-、*、/、(、)、=,参加运算的数为double类型且为正数。(要求:直接针对中缀算术表达式进⾏计算,不能转换为后缀或前缀表达式再进⾏计算,只考虑⼆元运算即可。)
输⼊
多组数据,每组数据⼀⾏,对应⼀个算术表达式,每个表达式均以“=”结尾。当表达式只有⼀个“=”时,输⼊结束。参加运算的数为double类型。
输出
对于每组数据输出⼀⾏,为表达式的运算结果。输出保留两位⼩数。
输⼊样例 1
2+2=
20*(4.5-3)=
=
输出样例 1
4.00
30.00
⽤的⽅法挺⿇烦的
#include<iostream>
using namespace std;
#define MAXSIZE 1000
#define OVERFLOW -2
#define OK 0
#define ERROR -1
typedef struct {
char* base;
char* top;
int stacksize;
}Stack1;
int Init_stack1(Stack1& S) {
S.base = new char[MAXSIZE];
if (!S.base)
return OVERFLOW;
S.top = S.base;
S.stacksize = MAXSIZE;
return OK;
}
int Push1(Stack1& S, char e) {
if (S.top - S.base == S.stacksize)
return ERROR;
*S.top = e;
中缀 表达式 运算
中缀表达式运算
中缀表达式是一种常见的数学表达式形式,其中运算符位于操作数之间。在中缀表达式中,操作符的优先级决定了计算的顺序。本文将介绍中缀表达式的基本概念、计算方法以及一些常见的应用场景。
一、中缀表达式的基本概念
中缀表达式是一种常见的数学表达式形式,如"2 + 3"、"4 * (5 - 6)"等。在中缀表达式中,操作数和运算符的顺序与我们通常书写数学表达式的方式相同。例如,在表达式 "2 + 3"中,操作数为2和3,运算符为+。
二、中缀表达式的计算方法
在计算中缀表达式时,我们需要考虑运算符的优先级。例如,在表达式 "2 + 3 * 4"中,乘法的优先级高于加法,所以我们首先计算乘法部分,得到12,然后再与2相加,得到最终结果14。
为了准确计算中缀表达式,我们需要使用一些算法和数据结构。其中,最常用的算法是转换为后缀表达式,然后使用栈来计算后缀表达式。
三、中缀表达式的转换方法
将中缀表达式转换为后缀表达式是计算中缀表达式的关键步骤。后缀表达式也称为逆波兰表达式,其中运算符位于操作数之后。例如,将中缀表达式 "2 + 3 * 4"转换为后缀表达式的结果为 "2 3 4 * +"。
转换方法如下:
1. 创建一个空栈和一个空列表。
2. 从左到右扫描中缀表达式的每个元素。
3. 如果元素是操作数,则将其添加到列表中。
4. 如果元素是左括号,则将其推入栈中。
5. 如果元素是右括号,则将栈中的元素弹出,直到遇到左括号。将弹出的元素添加到列表中。
6. 如果元素是运算符,则将栈中优先级大于或等于该运算符的元素弹出,并将弹出的元素添加到列表中。然后将该运算符推入栈中。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
江西理工大学软件学院计算机类课程实验报告
课程名称:数据结构
班级:11软件会计4班
姓名:黄健
学号:11222122
江西理工大学软件学院
一、目录(中缀表达式求值)
1、目录--------------------------------------------------------------2
2、实验目的--------------------------------------------------------3
3、实验要求--------------------------------------------------------3
4、实验仪器设备与材料-----------------------------------------3
5、实验原理--------------------------------------------------------4
6、实验步骤--------------------------------------------------------5
7、实验原始记录--------------------------------------------------6
8、实验数据分析计算结果--------------------------------------10
9、实验心得体会--------------------------------------------------11
10、思考题----------------------------------------------------------12
二:实验目的:
对一个合法的中缀表达式求值。简单起见,假设表达式只包含+,-,*,÷等4个双目运算符,且运算符本身不具有二义性,操作数均为一位数整。
三:要求:
1、正确解释表达式
2、符合四则运算规格
3、输出最后的计算结果
四:实验仪器设备与材料
参考书籍
电脑及其配件
Microsoft Visulai C++ 6.0
五:实验原理
对中缀表达式求值,通常使用“酸腐优先算法”。根据四则运算规则,在运算的每一步中,任意两个相继出班的运算符t和c之间的优先关系至多是下面三种关系之一:
1、t的优先级低于c
2、t的优先级高于c
3、t的优先级高于c
为实现算符优先算法,可以使用两个工作栈:一个栈存放运算符;另一个栈存放操作数,中缀表达式用一个字符串数组存储。
六:实验步骤
1、基本操作:
Initialization()
操作结果:构造链栈
tran()
初始条件:链栈已经存在
操作结果:将中缀表达式转化为后缀表达式
Sum()
初始条件:链栈已经存在并且中缀表达式已经转化为后缀表达式操作结果:求出表达式的值
2、程序包括三个模块:
(1)装程序模块
(2)构造链栈模块
(3)表达式转换模块
(4)表达式求职模块
最后测试数据:
输入表达式,以#结束:
后缀表达式为:
输出后缀表达式
计算结果为:
输出计算结果
七:实验原始记录
s truct node
{
char datat;
int num;
struct node*next;
};
V oid main()
{
Struct node*top,*head;
Top=initialization();
Printf("请输入表达式,以#结束:\n");
Gets(stringl);
Head=tran(top);
Sum(head);
}
Struct node*initialization()
{
Struct node*top;
Top=(struct node*)malloc(sizeof(struct node));
Top->data='';
Top->num=0;
Top->next=NULL;
Return top;
}
Struct node*p,*top;
Int i;
To p=s;
Int m;
Char a;
M=strlen(string1);
For(i=0;i<=m;i++)
{
a=string1[i];
If('0'<=string1[i]&&string1[i]<='9')
{
String2[j]=string1[i];j++;
}
Else
{
Swith(a)
{
Case'(':{
P=(struct node*)malloc(sizeof(struct node));
P->data=a;p->next=top;
Top=p;
Break;
}
case'*':
case'/':
String2[j]=' ';j++;
If((top->data=='*')||(top->data=='/'))
{
String2[j]=top->data;j++;
Top->data=a;
Break;
}
Else
{
P=(struct node*)malloc(sizeof(struct node));
P->data=a;p->next=top;
Top=p;
Break;
}
Case'+':
Case'-':{
String2[j]=' ';j++;
If(top->data=='+'||top->data=='*'||top->data=='/'
)
{
String2[j]=top->data;j++;
Top->data=a;
Break:
}
}
Case')':
{