数据结构 实验2——表达式求值
一、实验名称:表达式求值
二、实验学时:6学时
三、实验目的
1.理解栈的结构特点和基本操作特性;
2.掌握利用栈实现表达式求值算法。
四、实验内容(步骤)
输入一个算术表达式(以“=”结束),求其值。要求表达式以“=”结束,操作数为多位实数,对错误表达式要进行检测。
1.设置两个栈:optr算符栈和opnd操作数栈。初始置opnd为空栈;起始符“=”为optr的栈底元素;
2.自左向右扫描表达式中的每个字符c:
1)若c为操作数,则进opnd栈;
2)若c为算符,则让optr栈的栈顶元素与c比较优先级:
a.若栈顶算符优先级低于刚读入的运算符c,则让刚读入的运算符c进optr栈。
b.若栈顶算符优先级高于刚读入的运算符c,则将栈顶算符退栈,送入q;同时将操作数栈opnd退栈两次,得到两个操作数b、a,对a、b进行aqb运算后,将运算结果作为中间结果推入opnd栈。
c.若栈顶运算符的优先级与刚读入的运算符c相同,说明左右括号相遇,只需将栈顶运算符(左括号)退栈即可。
3.直到扫描到c为定界符,即optr栈的栈顶元素和当前读入的字符均为“=”,则整个表达式求值完毕。
实验源代码
#include<iostream>
#include<cstdlib>
#include<cmath>#define MAXSIZE 20
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0using namespace std;typedef int DataType;typedef struct
{DataType data[MAXSIZE];int top;
}SqStack;int InitStack(SqStack &S) // 构造一个空栈 S
{S.top=-1;return OK;
}int StackEmpty(SqStack S) // 判栈为空栈时返回值为真,反之为假
{return(S.top==-1?TRUE:FALSE);
}int StackFull(SqStack S) // 判栈为满栈时返回值为真,反之为假
{return(S.top==MAXSIZE-1?TRUE:FALSE);
}int Push(SqStack &S,DataType e) // 将元素e插入到栈中,作为新栈顶
{if(StackFull(S))return ERROR; // 栈满S.top++; // top+1,栈顶位置上移S.data[S.top]=e;return OK;
}int Pop(SqStack &S,DataType &e) // 若栈不为空,则删除栈顶元素
{if(StackEmpty(S))return ERROR; // 栈空e=S.data[S.top];S.top--;return OK;
}DataType GetTop(SqStack S) // 若栈不为空,则取栈顶元素
{DataType e;if(StackEmpty(S))return ERROR; // 栈空e=S.data[S.top]; // 取出数据,top不变return e;
}char Precede(char a,char b) // 比较两个算符的优先级
{char z;if((b=='+')||(b=='-')||(b=='*')||(b=='/')||(b=='(')||(b==')')||(b=='='))switch(a){case '+':case '-':if((b=='*')||(b=='/')||(b=='('))z='<';elsez='>';break;case '*':case '/':if(b=='(')z='<';elsez='>';break;case '(':if (b=='=')z='E';else if(b==')')z='=';else z='<';break;case ')':if(b=='(')z='E';elsez='>';break;case '=':if(b=='=')z='=';else if(b==')')z='E';else z='<';break;}else z='E';return(z);
}int In(char ch) // 判断字符ch是否为算符
{int i,flag=0;char op[7]={'+','-','*','/','(',')','='};for(i=0;i<7;i++){if(ch==op[i]){flag=1;break;}}return flag;
}DataType Operate(DataType a,char theta,DataType b)
{DataType z;switch(theta){case '+':z=a+b;break;case '-':z=a-b;break;case '*':z=a*b;break;case '/':z=a/b;break; }return(z);
}int CaculateExpression()
{SqStack optr,opnd;DataType x,theta,a,b,s;char c;c=getchar();InitStack(optr);Push(optr,(DataType)'=');InitStack(opnd);while(c!='=' || (char)GetTop(optr)!='='){if(!In(c)){s=c-48; // s=c-'0'; Push(opnd,(DataType)s);c=getchar();}elseswitch(Precede((char)GetTop(optr),c)){case '<': // 栈顶算符优先级低Push(optr,(DataType)c);c=getchar();break;case '=': // 优先级相同,脱去括号Pop(optr,x);c=getchar();break;case '>': // 栈顶算符优先级高,退栈并将运算Pop(optr,theta);Pop(opnd,b);Pop(opnd,a);Push(opnd,Operate(a,(char)theta,b));break;case 'E':printf("表达式中括号不匹配!");exit(1);}}return GetTop(opnd);
}int main()
{printf("%d\n",CaculateExpression());return 0;
}
运行结果
数据结构 实验2——表达式求值相关推荐
- c语言程序设计报告表达式求值,数据结构 课程设计表达式求值 实验报告
<数据结构 课程设计表达式求值 实验报告>由会员分享,可在线阅读,更多相关<数据结构 课程设计表达式求值 实验报告(21页珍藏版)>请在人人文库网上搜索. 1.实验课程名称 级 ...
- java求值不用后缀表达式_数据结构之后缀表达式求值(java实现)
数据结构之后缀表达式求值(java实现) 前记 今天在刷leet code的时候刷到了一道题,后缀表达式(逆波兰表达式)求值,我花了一会儿写了一下它的解法.但是今天我不谈什么是后缀表达式,有兴趣的 ...
- linux算术表达式求值数据结构,数据结构:算数表达式求值演示
题目:设计一个程序,演示用算符优先法对算数表达式求值的过程. 一.需求分析 以字符序列的形式从终端读入输入语法正确.不含变量的整数表达式.利用教科书表3.1给出的算符优先关系,实现对算数四则混合运算表 ...
- 常考数据结构与算法:表达式求值
题目描述 请写一个整数计算器,支持加减乘三种运算和括号. 示例2 输入 "(2*(3-4))*5" 返回值 -10 运算符号有优先级,所以使用单调栈可以解决改问题.如下代码,效率比 ...
- 数据结构—— 基于二叉树的算术表达式求值
实验五 基于二叉树的算术表达式求值 数据结构--中序表达式求值(栈实现) 实验目的: 1.掌握二叉树的二叉链表存储表示和二叉树的遍历等基本算法. 2.掌握根据中缀表达式创建表达式树的算法 3.掌握基于 ...
- 数据结构 C++实现 算术表达式求值
文章目录 一.实验目的 二.实验要求 三.代码内容 1.创建链栈并初始化 2.入栈出栈取栈顶元素 3.判断是否是运算符 4.判断运算符优先级 5.运算函数 6.总代码 四.运算结果 五.总结 一.实验 ...
- 如何利用计算机求函数解析式,数据结构表达式求值(计算器)实验报告(共10篇).doc...
数据结构表达式求值(计算器)实验报告(共10篇) 数据结构表达式求值(计算器)实验报告(共10篇) 数据结构课程设计_实验报告(一)表达式求值(计算器) 数据结构课程设计 实验报告 起止时间:2015 ...
- 【数据结构】栈的应用-算术表达式求值#数据结构实验任务书
实验题目:栈的应用-算术表达式求值 正文 实验环境: Visual C++ 2010 实验目的: 1.掌握栈的定义及实现: 2.掌握利用栈求解算术表达式的方法. 实验内容: 通过修改完善教材中的算法3 ...
- 北京林业大学数据结构实验二 基于栈的算术表达式求值算法
第1关:基于栈的中缀算术表达式求值 参见课本P75 例3.3 #include <iostream> #include<iomanip>#define MAXSIZE 100 ...
- [数据结构]表达式求值
一.问题描述 表达式求值是数学中的一个基本问题,也是程序设计中的一个简单问题.我们所涉及的表达式中包含数字和符号,本实验中处理的符号包括'+'.'-'.'*'.'/'.'('和')',要求按照我们所习 ...
最新文章
- 树莓派应用实例2:环境温湿度测量
- python 数据挖掘 简书_[Python数据挖掘入门与实践]-第一章开启数据挖掘之旅
- Bitmap添加文字水印
- 【AI视野·今日Robot 机器人论文速览 第三期】Tue, 8 Jun 2021
- 代码 or 指令,浅析ARM架构下的函数的调用过程
- 总结django form
- 压缩文件后,每次的HASH值(MD5)都不相同的原因
- NOI2019 SX 模拟赛 no.5
- 两台计算机通过路由器连接网络,如何设置将两台计算机连接到Internet的路由器...
- 【深入浅出通信原理-学习笔记】信源编码
- vue项目中使用rem替换px-使用方法-02-问题规整
- PythonTutor本地化运行
- Python语言程序设计(嵩天老师)-期末考核2.1-快乐数字
- android中JNI知识(很全)
- 记一次机器内存过高引起的线上故障
- 计算机网络常见知识点总结
- 易语言助手用法与方便之处
- Unity3d+百度AI 实现摄像头画面实时手势识别
- js兼容方法:事件添加|事件绑定|事件监听 addEvent
- stm32 刹车 功能