一、实验名称:表达式求值

二、实验学时: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——表达式求值相关推荐

  1. c语言程序设计报告表达式求值,数据结构 课程设计表达式求值 实验报告

    <数据结构 课程设计表达式求值 实验报告>由会员分享,可在线阅读,更多相关<数据结构 课程设计表达式求值 实验报告(21页珍藏版)>请在人人文库网上搜索. 1.实验课程名称 级 ...

  2. java求值不用后缀表达式_数据结构之后缀表达式求值(java实现)

    数据结构之后缀表达式求值(java实现) 前记 ​ 今天在刷leet code的时候刷到了一道题,后缀表达式(逆波兰表达式)求值,我花了一会儿写了一下它的解法.但是今天我不谈什么是后缀表达式,有兴趣的 ...

  3. linux算术表达式求值数据结构,数据结构:算数表达式求值演示

    题目:设计一个程序,演示用算符优先法对算数表达式求值的过程. 一.需求分析 以字符序列的形式从终端读入输入语法正确.不含变量的整数表达式.利用教科书表3.1给出的算符优先关系,实现对算数四则混合运算表 ...

  4. 常考数据结构与算法:表达式求值

    题目描述 请写一个整数计算器,支持加减乘三种运算和括号. 示例2 输入 "(2*(3-4))*5" 返回值 -10 运算符号有优先级,所以使用单调栈可以解决改问题.如下代码,效率比 ...

  5. 数据结构—— 基于二叉树的算术表达式求值

    实验五 基于二叉树的算术表达式求值 数据结构--中序表达式求值(栈实现) 实验目的: 1.掌握二叉树的二叉链表存储表示和二叉树的遍历等基本算法. 2.掌握根据中缀表达式创建表达式树的算法 3.掌握基于 ...

  6. 数据结构 C++实现 算术表达式求值

    文章目录 一.实验目的 二.实验要求 三.代码内容 1.创建链栈并初始化 2.入栈出栈取栈顶元素 3.判断是否是运算符 4.判断运算符优先级 5.运算函数 6.总代码 四.运算结果 五.总结 一.实验 ...

  7. 如何利用计算机求函数解析式,数据结构表达式求值(计算器)实验报告(共10篇).doc...

    数据结构表达式求值(计算器)实验报告(共10篇) 数据结构表达式求值(计算器)实验报告(共10篇) 数据结构课程设计_实验报告(一)表达式求值(计算器) 数据结构课程设计 实验报告 起止时间:2015 ...

  8. 【数据结构】栈的应用-算术表达式求值#数据结构实验任务书

    实验题目:栈的应用-算术表达式求值 正文 实验环境: Visual C++ 2010 实验目的: 1.掌握栈的定义及实现: 2.掌握利用栈求解算术表达式的方法. 实验内容: 通过修改完善教材中的算法3 ...

  9. 北京林业大学数据结构实验二 基于栈的算术表达式求值算法

    第1关:基于栈的中缀算术表达式求值 参见课本P75 例3.3 #include <iostream> #include<iomanip>#define MAXSIZE 100 ...

  10. [数据结构]表达式求值

    一.问题描述 表达式求值是数学中的一个基本问题,也是程序设计中的一个简单问题.我们所涉及的表达式中包含数字和符号,本实验中处理的符号包括'+'.'-'.'*'.'/'.'('和')',要求按照我们所习 ...

最新文章

  1. 树莓派应用实例2:环境温湿度测量
  2. python 数据挖掘 简书_[Python数据挖掘入门与实践]-第一章开启数据挖掘之旅
  3. Bitmap添加文字水印
  4. 【AI视野·今日Robot 机器人论文速览 第三期】Tue, 8 Jun 2021
  5. 代码 or 指令,浅析ARM架构下的函数的调用过程
  6. 总结django form
  7. 压缩文件后,每次的HASH值(MD5)都不相同的原因
  8. NOI2019 SX 模拟赛 no.5
  9. 两台计算机通过路由器连接网络,如何设置将两台计算机连接到Internet的路由器...
  10. 【深入浅出通信原理-学习笔记】信源编码
  11. vue项目中使用rem替换px-使用方法-02-问题规整
  12. PythonTutor本地化运行
  13. Python语言程序设计(嵩天老师)-期末考核2.1-快乐数字
  14. android中JNI知识(很全)
  15. 记一次机器内存过高引起的线上故障
  16. 计算机网络常见知识点总结
  17. 易语言助手用法与方便之处
  18. Unity3d+百度AI 实现摄像头画面实时手势识别
  19. js兼容方法:事件添加|事件绑定|事件监听 addEvent
  20. stm32 刹车 功能

热门文章

  1. WES7创建系统恢复盘
  2. 专利申请--权利要求书vs说明书
  3. 基于SSM的校园二手交易平台系统
  4. html5实现手写签名板,用于电子文档签名
  5. oracle客户端 PLSQL安装配置教程
  6. EXCEL【数据处理之数据清洗——重复数据处理】
  7. Visual Studio2019使用nmake编译调用libcurl库
  8. 电商产品经理必修课之学员招募及在线课程学习
  9. Jquery API帮助文档 chm
  10. cisco防火墙(Cisco防火墙型号asa)