文章目录

  • 一、实验目的
  • 二、实验要求
  • 三、代码内容
    • 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. 数据结构—— 基于二叉树的算术表达式求值

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

  2. 算术表达式求值的程序设计与实现_数据结构课程设计

    以下内容可且仅可供参考,如有错误欢迎指正. 部分思路借鉴算术表达式求值(C语言栈)_夜何其的博客-CSDN博客_c语言利用栈求解算术表达式侵删致歉 <算术表达式求值的程序设计与实现>题目要 ...

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

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

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

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

  5. 《Algorithms》—— Dijkstra 的双栈算术表达式求值算法

    想当年学数据结构的时候,一直觉得这个是我一辈子都搞不懂的一个东西.现在看看...还挺简单的... 重点在于如何解析由括号.运算符和数字组成的字符串,并按照正确的顺序完成各种初级算术操作.利用了两个栈( ...

  6. c语言作业算术表达式求值,算术表达式求值演示(C语言版)

    //头文件预处理命令 #include #include //----------函数结果状态代码----------------- #define TRUE 1 #define FALSE 0 #d ...

  7. boost::proto模块实现简单的算术表达式求值器的测试程序

    boost::proto模块实现简单的算术表达式求值器的测试程序 实现功能 C++实现代码 实现功能 boost::proto模块实现简单的算术表达式求值器的测试程序 C++实现代码 #include ...

  8. 【Java】基于栈的算术表达式求值

    定义异常类 public class ExpressionException extends RuntimeException {private static final long serialVer ...

  9. 信息学奥赛一本通 1397:简单算术表达式求值 | OpenJudge NOI 1.12 01:简单算术表达式求值

    [题目链接] ybt 1397:简单算术表达式求值 OpenJudge NOI 1.12 01:简单算术表达式求值 [题目考点] 1. 函数 2. 选择结构 [解题思路] 这一章节都是练习函数,那么这 ...

最新文章

  1. 阿里分布式事务框架GTS开源了!
  2. R语言-包的安装、载入及使用方法
  3. SpringCloud成长之路 一 注册与发现(Eureka)
  4. python 时间字符串和时间戳之间的转换
  5. 可作为工质状态参数的是_制冷工质的热力状态参数都有哪些?
  6. linux计算机硬件信息,计算机linux查看硬件信息命令.doc
  7. matlab都有什么接口,介绍MATLAB与C++的几种接口方式
  8. Redis设计与实现之SDS和链表
  9. 我用过的一些web.xml配置
  10. ie浏览器打字不显示文字框命令
  11. easyexcell导出专题
  12. 高频板和普通PCB板的区别
  13. 如何在php中添加音乐播放器,音乐播放器的制作实例(html5)-
  14. dwg格式的图纸文件怎么打开?一分钟教你快速解决!
  15. 华为HG8347R V3R016C10S135光猫桥接 北京联通 恢复华为原版
  16. 2021 HTML面试题(最新)不定时更新
  17. 笔记-中项/高项学习期间的错题笔记2
  18. php检索本地文件,神器:不仅秒搜本地文件,还能1秒在线检索文献!
  19. MySQL 3306端口被占用 ERROR 1043 (08S01): Bad handshake
  20. Linux磁盘满了怎么办?

热门文章

  1. VC 判断 Windows 操作系统版本
  2. 【Java Web】Day 3 JDBC
  3. 免杀Bdfproxy
  4. mapbox 地图交互
  5. p标签中文字换行问题
  6. 哈希冲突、哈希冲突的解决方法
  7. HashMap是怎么解决哈希冲突的
  8. 最新kali之lbd
  9. 国经信中心 | APEC生活+:“实在田美”与BioV.tech的融合、农牧文旅的探索 | APEC-HUB公益平台
  10. puzzle(0917)六宫数局