数据结构 C++实现 算术表达式求值
文章目录
- 一、实验目的
- 二、实验要求
- 三、代码内容
- 1、创建链栈并初始化
- 2、入栈出栈取栈顶元素
- 3、判断是否是运算符
- 4、判断运算符优先级
- 5、运算函数
- 6、总代码
- 四、运算结果
- 五、总结
一、实验目的
1、了解栈的特性,以及它在实际问题中的应用。
2、掌握栈的实现方法以及它的基本操作,学会运用栈来解决问题。
二、实验要求
表达式求值是数学中的一个基本问题,也是程序设计中的一个经典问题。我们所涉及的表达式中包含数字(一位正整数)和运算符号,本课程设计中处理的运算符号包括‘+’、‘-’、‘’、‘/’、‘(’和‘)’。要求按照我们所习惯的计算顺序,正确计算出表达式的值,并输出至屏幕上。为了计算方便,表达式以#号开始,并以#号结束输入。例如表达式:#2(3+4)-6/3#,运行的输出结果为12。
三、代码内容
我是使用链栈实现的
1、创建链栈并初始化
#include<iostream>
#define OK 1
#define ERROR 0
using namespace std;
typedef char SElemType;
typedef int Status;
//链栈存储结构
typedef struct Node {SElemType data;struct Node* next;
}Node, * LinkStack;//链栈初始化
Status InitStack(LinkStack &S) { //构造空栈,栈顶指针置空S = NULL;return OK;
}
2、入栈出栈取栈顶元素
//链栈入栈
Status Push(LinkStack &S, SElemType e) {//栈顶插入元素eLinkStack p = new Node; //生成新节点p->data = e; //新节点数据域置为ep->next = S; //将新节点插入栈顶S = p; //修改栈顶指针为preturn OK;
}//链栈的出栈
Status Pop(LinkStack &S, SElemType &e) {if (S == NULL) //栈为空return ERROR;LinkStack p; //定义临时链栈e = S->data; //将栈顶元素赋值给ep = S; //临时存储栈顶空间,以备释放S = S->next; //修改栈顶指针delete p; //删除栈顶指针return OK;
}
//取栈顶元素
SElemType GetTop(LinkStack S) {if (S != NULL) //栈非空return S->data;
}
3、判断是否是运算符
//判断读入的字符ch是否为运算符
Status In(SElemType ch) {if (ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '(' || ch == ')'||ch=='#')return OK;elsereturn ERROR;
}
4、判断运算符优先级
//判断运算符栈顶元素与读入运算符ch的优先级
SElemType Precede(SElemType a, SElemType b) {if (a == '+' || a == '-') {if (b == '+' || b == '-' || b == '#' || b == ')')return '>';else return '<';}if (a == '*' || a == '/') {if (b == '(')return '<';else return '>';}if (a == '(') {if (b == ')')return '=';else return '<';}if (a == '#') {if (b == '#')return '=';else return '<';}if (a == ')')return '>';
}
5、运算函数
这里不需要将char转换为int来运算,只需要输出结果是转换一下即可
//运算函数
SElemType Operate(SElemType a, SElemType t, SElemType b) {//进行运算的函数 switch (t) {case '+':return a + b;case '-':return a - b;case '*':return a * b;case '/':return a / b;}
}
6、总代码
#include<iostream>
#define OK 1
#define ERROR 0
using namespace std;
typedef char SElemType;
typedef int Status;
//链栈存储结构
typedef struct Node {SElemType data;struct Node* next;
}Node, * LinkStack;//链栈初始化
Status InitStack(LinkStack &S) { //构造空栈,栈顶指针置空S = NULL;return OK;
}//链栈入栈
Status Push(LinkStack &S, SElemType e) {//栈顶插入元素eLinkStack p = new Node; //生成新节点p->data = e; //新节点数据域置为ep->next = S; //将新节点插入栈顶S = p; //修改栈顶指针为preturn OK;
}//链栈的出栈
Status Pop(LinkStack &S, SElemType &e) {if (S == NULL) //栈为空return ERROR;LinkStack p; //定义临时链栈e = S->data; //将栈顶元素赋值给ep = S; //临时存储栈顶空间,以备释放S = S->next; //修改栈顶指针delete p; //删除栈顶指针return OK;
}//取栈顶元素
SElemType GetTop(LinkStack S) {if (S != NULL) //栈非空return S->data;
}//判断读入的字符ch是否为运算符
Status In(SElemType ch) {if (ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '(' || ch == ')'||ch=='#')return OK;elsereturn ERROR;
}//判断运算符栈顶元素与读入运算符ch的优先级
SElemType Precede(SElemType a, SElemType b) {if (a == '+' || a == '-') {if (b == '+' || b == '-' || b == '#' || b == ')')return '>';else return '<';}if (a == '*' || a == '/') {if (b == '(')return '<';else return '>';}if (a == '(') {if (b == ')')return '=';else return '<';}if (a == '#') {if (b == '#')return '=';else return '<';}if (a == ')')return '>';
}//运算函数
SElemType Operate(SElemType a, SElemType t, SElemType b) {//进行运算的函数 switch (t) {case '+':return a + b;case '-':return a - b;case '*':return a * b;case '/':return a / b;}
}//算法表达式求值的优先算法,设OPTR和OPND分别为运算符栈和操作数栈
void EvaluateExpression() {LinkStack OPND, OPTR; //定义栈SElemType ch, t,t1,t2;InitStack(OPND); //初始化操作数栈InitStack(OPTR); //初始化运算符栈Push(OPTR,'#'); //入栈cin >> ch;while (ch != '#' || GetTop(OPTR) != '#') {//表达式没有扫描完毕或者OPTR栈顶不为‘#’时执行if (!In(ch)) { //ch不是运算符Push(OPND, ch-'0'); //进入OPND栈cin >> ch; //读取下一个字符}elseswitch (Precede(GetTop(OPTR), ch)) { //比较OPTR栈顶元素和ch的优先级case '<':Push(OPTR, ch); //将ch压入OPTR栈cin >> ch; //读取下一个字符break;case '>':Pop(OPTR, t); //弹出OPTR栈顶运算符,赋值给tPop(OPND, t2); //后进先出Pop(OPND, t1); //弹出OPND栈顶两个运算数Push(OPND, Operate(t1, t, t2)); //将运算结果压入OPND栈break;case '=': //OPTR栈顶元素是'('且ch是')'Pop(OPTR, t); //弹出栈顶'('cin >> ch; //读取下一个字符break;}}cout<<(int)GetTop(OPND)<<endl; //将char转换为int
}int main() {EvaluateExpression();return 0;
}
四、运算结果
#2*(3+4)-6/3#
第一个#已经入栈过了
五、总结
这里使用链栈来实现,也可以使用顺序栈来实现
程序整体比较简单,健壮性不高,界面简单,没有提示语句
数据结构 C++实现 算术表达式求值相关推荐
- 数据结构—— 基于二叉树的算术表达式求值
实验五 基于二叉树的算术表达式求值 数据结构--中序表达式求值(栈实现) 实验目的: 1.掌握二叉树的二叉链表存储表示和二叉树的遍历等基本算法. 2.掌握根据中缀表达式创建表达式树的算法 3.掌握基于 ...
- 算术表达式求值的程序设计与实现_数据结构课程设计
以下内容可且仅可供参考,如有错误欢迎指正. 部分思路借鉴算术表达式求值(C语言栈)_夜何其的博客-CSDN博客_c语言利用栈求解算术表达式侵删致歉 <算术表达式求值的程序设计与实现>题目要 ...
- 【数据结构】栈的应用-算术表达式求值#数据结构实验任务书
实验题目:栈的应用-算术表达式求值 正文 实验环境: Visual C++ 2010 实验目的: 1.掌握栈的定义及实现: 2.掌握利用栈求解算术表达式的方法. 实验内容: 通过修改完善教材中的算法3 ...
- 北京林业大学数据结构实验二 基于栈的算术表达式求值算法
第1关:基于栈的中缀算术表达式求值 参见课本P75 例3.3 #include <iostream> #include<iomanip>#define MAXSIZE 100 ...
- 《Algorithms》—— Dijkstra 的双栈算术表达式求值算法
想当年学数据结构的时候,一直觉得这个是我一辈子都搞不懂的一个东西.现在看看...还挺简单的... 重点在于如何解析由括号.运算符和数字组成的字符串,并按照正确的顺序完成各种初级算术操作.利用了两个栈( ...
- c语言作业算术表达式求值,算术表达式求值演示(C语言版)
//头文件预处理命令 #include #include //----------函数结果状态代码----------------- #define TRUE 1 #define FALSE 0 #d ...
- boost::proto模块实现简单的算术表达式求值器的测试程序
boost::proto模块实现简单的算术表达式求值器的测试程序 实现功能 C++实现代码 实现功能 boost::proto模块实现简单的算术表达式求值器的测试程序 C++实现代码 #include ...
- 【Java】基于栈的算术表达式求值
定义异常类 public class ExpressionException extends RuntimeException {private static final long serialVer ...
- 信息学奥赛一本通 1397:简单算术表达式求值 | OpenJudge NOI 1.12 01:简单算术表达式求值
[题目链接] ybt 1397:简单算术表达式求值 OpenJudge NOI 1.12 01:简单算术表达式求值 [题目考点] 1. 函数 2. 选择结构 [解题思路] 这一章节都是练习函数,那么这 ...
最新文章
- 阿里分布式事务框架GTS开源了!
- R语言-包的安装、载入及使用方法
- SpringCloud成长之路 一 注册与发现(Eureka)
- python 时间字符串和时间戳之间的转换
- 可作为工质状态参数的是_制冷工质的热力状态参数都有哪些?
- linux计算机硬件信息,计算机linux查看硬件信息命令.doc
- matlab都有什么接口,介绍MATLAB与C++的几种接口方式
- Redis设计与实现之SDS和链表
- 我用过的一些web.xml配置
- ie浏览器打字不显示文字框命令
- easyexcell导出专题
- 高频板和普通PCB板的区别
- 如何在php中添加音乐播放器,音乐播放器的制作实例(html5)-
- dwg格式的图纸文件怎么打开?一分钟教你快速解决!
- 华为HG8347R V3R016C10S135光猫桥接 北京联通 恢复华为原版
- 2021 HTML面试题(最新)不定时更新
- 笔记-中项/高项学习期间的错题笔记2
- php检索本地文件,神器:不仅秒搜本地文件,还能1秒在线检索文献!
- MySQL 3306端口被占用 ERROR 1043 (08S01): Bad handshake
- Linux磁盘满了怎么办?