【题目】

任何一个表达式都由操作数、运算符和界限符组成的,为了叙述的简洁,在此仅讨论简单算数表达式的求值问题,这种表达式只包含加、减、乘、除4种运算符。
例如:
控制台输入 2*(2+3)-5+4*5
控制台输出 25

我们知道,算术四则运算遵循以下3条规则:
1、先乘除后加减
2、从左到右运算
3、先括号内后括号外

【思路分析】

1、通过for循环索引来遍历我们输入的表达式
2、如果索引处的值是数字就直接压入数字栈
3、如果索引处的值是运算符分两种情况
3.1、如果符号栈为空就直接入栈
3.2、如果符号栈中有运算符,将当前运算符优先级与栈顶运算符的优先级比较。如果当前运算符优先级小于或等于栈顶运算符的优先级,就需要从数字栈中弹出两个数并从符号栈中弹出一个运算符。进行运算后将结果入数字栈,循环直至当前运算符优先级大于栈顶运算符的优先级将,然后当前运算符入符号栈。如果当前运算符优先级大于栈顶运算符的优先级,就直接入符号栈。如果是"(“号就直接入符号栈,如果是”)"就从数字栈中弹出两个数并从符号栈中弹出一个运算符。进行运算后将结果入数字栈,循环这个操作直至遇到")“符号,将”)"符号弹出。
4、当表达式扫面完毕,就按顺序从数字栈中弹出两个数字从符号栈中弹出一个运算符,将运行结果压入数字栈
5、重复第4不操作直至数字栈中只剩一个数字,这个数字就是表达式的结果

【完整代码】

#include<iostream>
#include <string>
#define OK 1
#define ERROR 0
#define MAXSIZE 100
using namespace std;
typedef int Status;
typedef int SElemType;typedef struct {SElemType* base;//栈低指针SElemType* top;//栈顶指针int stackSize;//栈可用最大容量
}SqStack;/***初始化顺序栈*/
Status InitStack(SqStack &s){s.base = new SElemType[MAXSIZE];//为顺序栈动态分配一个最大容量为MAXSIZE的数组空间if(!s.base) exit(ERROR);s.top = s.base;s.stackSize = MAXSIZE;return OK;
}
/***入栈* */
Status Push(SqStack &s,SElemType e){if(s.top-s.base == s.stackSize)//为什么不s.top>s.stackSize 因为s.top是指针s.stackSize是intreturn ERROR;*s.top=e;//*解引用s.top ++;return OK;
}
/***弹栈* */
Status Pop(SqStack &s,SElemType &e){if (s.top == s.base)return ERROR;s.top--;e = *s.top;return OK;
}
/***取出栈顶元素* */
SElemType GetTop(SqStack &s){if(s.top == s.base) return ERROR;return *(s.top-1);
}
/***运算符优先级* */
int priority(int oper){if (oper == '*' || oper == '/') return 1;else if (oper == '+' || oper == '-') return 0;else if (oper == '(' || oper == ')') return 2;else return -1;
}
/***从数字栈中弹出两个数并从符号栈中弹出一个运算符并进行运算返回运行结果* */
int operatorNum(SqStack &numStack,SqStack &operatorStack){int right,left,oper1;Pop(numStack,left);Pop(numStack,right);Pop(operatorStack,oper1);switch (oper1){case 42 :return right*left;case 43:return right+left;case 45:return right-left;case 47:return right/left;}
}
void noSingle(string num,SqStack &numStack){for (int j = 0; j < num.length(); ++j) {int i;Pop(numStack, i);}Push(numStack, atoi(num.c_str()));//string转int
}
int main(){string input;cin>>input;SqStack numStack;SqStack operatorStack;InitStack(numStack);InitStack(operatorStack);string num;for (int i = 0; i <input.length(); i++) {if (48<=input[i] && input[i]<=57){//是数字Push(numStack,input[i]-48);string str(1,input[i]);//char转stringnum.append(str);if(i == input.length()-1 && num.length()>=2)noSingle(num,numStack);}else{if (num.length()>=2)noSingle(num,numStack);num = "";//是操作符且栈为空if (operatorStack.top == operatorStack.base)Push(operatorStack,input[i]);else{//栈不为空SElemType oper = GetTop(operatorStack);if(input[i] == ')'){while(oper != '('){int result = operatorNum(numStack,operatorStack);Push(numStack,result);oper = GetTop(operatorStack);}Pop(operatorStack,oper);}else if (priority(input[i]) <= priority(oper) && priority(oper) != 2){while (priority(input[i]) <= priority(oper)){int result = operatorNum(numStack,operatorStack);Push(numStack,result);oper = GetTop(operatorStack);}Push(operatorStack, input[i]);}else{Push(operatorStack, input[i]);}}}}while (numStack.top != numStack.base+1){int result = operatorNum(numStack,operatorStack);Push(numStack,result);}int result = GetTop(numStack);cout<<"结果="<<result;return 0;
}

【运行结果】

2*(2+3)-5+4*5
结果=25
Process finished with exit code 0

表达式求值——数据结构严蔚敏C语言版栈数据结构课后练习相关推荐

  1. 构建线性表的c语言代码,数据结构严蔚敏C语言版—线性表顺序存储结构(顺序表)C语言实现相关代码...

    1.运行环境 这里说明一下这里所有的C语言代码都是基于code::blocks 20.03编译运行的.当然一些其他集成开发环境应该也是可以的,个人不太喜欢功能太过强大的IDE,因为那同样意味着相关设置 ...

  2. 数据结构严蔚敏C语言版—线性表顺序存储结构(顺序表)C语言实现相关代码

    数据结构严蔚敏C语言版-线性表顺序存储结构(顺序表)C语言实现相关代码 1.运行环境 2.准备工作 1)项目构建 1>新建一个SeqList项目 2>新建两个文件Sources和Heade ...

  3. 表达式求值(二叉树方法/C++语言描述)(二)

    表达式二叉树节点的数据可能是运算数或运算符,可以使用一个联合体进行存储:同时还需要一个变量来指示存储的是运算数还是运算符,可以采用和栈方法求值中一样的枚举类型TokenType: 1 typedef ...

  4. 4.树和二叉树——数据结构 (严蔚敏C语言版)

    4.树 4.1树的定义 树(Tree)是n(n≥0)个结点的有限集,它或为空树(n=0);或为非空树,对于非空树T: (1)有且仅有一个称之为根的结点; (2)除根结点以外的其余结点可分为m (m&g ...

  5. 数据结构之二叉树_二叉排序树(严蔚敏C语言版)

    为什么80%的码农都做不了架构师?>>>    #include <iostream> #include <stdlib.h> #define elemTyp ...

  6. 8.排序——数据结构(严蔚敏C语言版)

    8.排序 8.1概念 1.什么是排序? 排序:将一组杂乱无章的数据按一定规律顺次排列起来.即,将无序序列排成一个有序序列(由小到大或由大到小)的运算.如果参加排序的数据结点包含多个数据域,那么排序往往 ...

  7. 7.查找——数据结构(严蔚敏 C语言版)

    7.查找 7.1概念 7.1.1查找的分类 查找表可分为两类: 静态查找表: 仅作"查询"(检索) 操作的查找表. 动态查找表: 作"插入"和"删除& ...

  8. 数据结构(严蔚敏C语言版)代码实现持续更新中

    文章汇总: 线性表: 线性表的顺序表示和实现 线性表的链式表示和实现 静态链表的表示和实现 栈: 顺序栈--栈的顺序表示和实现 链栈--栈的链式表示和实现 队列: 链队列--队列的链式表示和实现 顺序 ...

  9. python 表达式求值数据结构_python 数据结构与算法

    python 数据结构与算法 1 python常见数据结构性能 1.1 List 1.1.1 安索引取值和赋值 1.1.2 列表append和__add__() 1.1.3 使用timeit模块测试执 ...

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

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

最新文章

  1. python中thread的setDaemon、join的用法
  2. JAXP进行DOM和SAX解析
  3. Windows下的PHP开发环境搭建——PHP线程安全与非线程安全、Apache版本选择,及详解五种...
  4. 机械学哪种计算机语言,对于机器学习,到底该选择哪种编程语言?
  5. 当Python列表遇上复合赋值运算符+=
  6. 两个Listbox的关联(省名 和 该省城市的对应)
  7. 测试人员必会用例设计方法--正交表
  8. 随机数算法 java_最全的java随机数生成算法
  9. JPG如何免费压缩大小并且保证清晰度
  10. 在 linux 下如何解压扩展名为 xz 的文件
  11. Django分布式路由
  12. 信息安全密码学实验三:密码学数学基础实验
  13. 239页11万字新型智慧城市运营中心IOC大数据平台建设方案
  14. 07深圳浩项隔音窗,隔音知识与方法
  15. android 手机强制关机代码,安卓手机如何强制关机?安卓手机强制关机方法[多图]...
  16. java gps轨迹_记录 GPS 轨迹 LogGPS
  17. 植被覆盖度(FVC)计算
  18. java 局域网文件拷贝文件_局域网使用Java进行文件传输
  19. 使用 Bat 批处理脚本复制目录的相关操作
  20. 用Python驱动Headless Chrome

热门文章

  1. 计算机工具栏查看,win10工具栏显示网速小工具_技术教程
  2. 如何关闭计算机远程桌面连接,怎么用命令行开启和关闭远程桌面?
  3. SAS Base备考经历分享
  4. 易用性软件测试用例,软件性能测试规定——易用性测试规定
  5. 王爽《汇编语言》笔记(详细)
  6. VC6 程序 在VS2019或其他高版本上编译运行
  7. SAP 系统License查看申请及导入
  8. java 删 除文件操作_Java File文件处理 删除文件
  9. Matlab学习:读取excel中数据
  10. Centos7安装SCIP with AMPL