表达式求值(栈方法/C++语言描述)(二)
上篇中完成了对表达式求值的整体过程,接下来看看如何处理不同类型的token。
对运算数的处理比较简单,它直接调用函数strtod(),将字符串中的运算数转换为浮点类型并将它压入运算数栈中:
void Calculator::dealWithNumber(char *&pToken) throw (string) {
if (!isdigit(*pToken) && *pToken != '-') {
throw string("bad token '") + *pToken + "'";
}
_stkNumbers.push(strtod(pToken, &pToken));
}
函数strtod()和函数isdigital()分别被声明于头文件cstdlib和cctype中,前者通过第二个参数返回指向转换结束位置下一个字符的指针。
对运算符的处理相对而言就比较复杂了,在上篇中曾讨论过它的处理流程:
void Calculator::dealWithOperator(char *&pToken) throw (string) {
if (*pToken != '+' && *pToken != '-' && *pToken != '*' && *pToken != '/') {
throw string("bad token '") + *pToken + "'";
}
if (!_stkOperators.empty()
&& priority(_stkOperators.top()) >= priority(*pToken)) {
calculateStack();
}
_stkOperators.push(*pToken);
pToken++;
}
静态成员函数priority()返回运算符的优先级:
int Calculator::priority(char op) {
assert(op == '+' || op == '-' || op == '*' || op == '/' || op == '(');
if (op == '+' || op == '-') {
return ;
} else if (op == '*' || op == '/') {
return ;
} else {
return ;
}
}
对左括号的处理和对运算数的处理基本一致——直接压入运算符栈中。之所以左括号在priority()函数中的优先级最低,是为了保证在右括号出现之前,左括号一直都不会被弹出:
void Calculator::dealWithLeftBrac(char *&pToken) throw (string) {
if (*pToken != '(') {
throw string("bad token '") + *pToken + "'";
}
_stkOperators.push(*pToken);
pToken++;
}
处理右括号的过程与整个表达式最后的处理过程类似,一直进行运算压栈,直至运算符栈顶元素为左括号为止;当然,运算符栈弹至空时左括号仍未出现,即出现了括号不匹配:
void Calculator::dealWithRightBrac(char *&pToken) throw (string) {
if (*pToken != ')') {
throw string("bad token '") + *pToken + "'";
}
while (!_stkOperators.empty() && _stkOperators.top() != '(') {
calculateStack();
if (_stkOperators.empty()) {
throw string("bad token ')'");
}
}
_stkOperators.pop();
pToken++;
}
最后编写主函数,大功告成!
表达式求值(栈方法/C++语言描述)(二)的更多相关文章
- 第四届河南省ACM 表达式求值 栈
表达式求值 时间限制: 1 Sec 内存限制: 128 MB 提交: 14 解决: 7 [提交][状态][讨论版] 题目描述 Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简 ...
- 表达式求值 (栈) 用C++实现
#include <cstdio> #include <cstdlib> #include <cmath> #include <stack> #incl ...
- Python解析 算数表达式求值 栈的使用
使用Python实现一种算数表达式求值的算法,模拟这种使用栈的方式,这是由E.W.Dijkstra在20世纪60年代发明的一种非常简单的算法.代码模拟仅仅表现一种编程思想,代码的逻辑并不完全: if ...
- 表达式求值(栈方法/C++语言描述)(一)
一个算数表达式(以下简称为表达式)由运算数.运算符.左括号和右括号组成,定义一个枚举类型TokenType表示为: typedef enum { BEGIN, NUMBER, OPERATOR, LE ...
- 表达式求值(栈方法/C++语言描述)(三)
代码清单 // calculator.h #ifndef CALCULATOR_H #define CALCULATOR_H #include <stack> #include <s ...
- 2015 UESTC 数据结构专题N题 秋实大哥搞算数 表达式求值/栈
秋实大哥搞算数 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/1074 Des ...
- 表达式求值--数据结构C语言算法实现
这篇博客介绍的表达式求值是用C语言实现的,只使用了c++里面的引用. 数据结构课本上的一个例题,但是看起来很简单,实现却遇到了很多问题. 这个题需要构建两个栈,一个用来存储运算符OPTR, 一个用来存 ...
- LeetCode:逆波兰表达式求值【150】
LeetCode:逆波兰表达式求值[150] 题目描述 根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除 ...
- 利用栈实现算术表达式求值(Java语言描述)
利用栈实现算术表达式求值(Java语言描述) 算术表达式求值是栈的典型应用,自己写栈,实现Java栈算术表达式求值,涉及栈,编译原理方面的知识.声明:部分代码参考自茫茫大海的专栏. 链栈的实现: pa ...
随机推荐
- Linux系统/dev/mapper目录浅谈
Linux系统的一般的文件系统名称类似于/dev/sda1或/dev/hda1,但是今天在进行系统维护的时候,利用df -h 命令敲出了/dev/mapper/VolGroup-lv_root和/de ...
- jquery里的attr()方法和prop()方法的区别
在jq的高版本里出现了prop()方法,那么attr()和prop()的区别在哪呢?这两者分别在什么情况用呢? 对于HTML元素本身就带有的固有属性,在处理时,使用prop方法. 对于HTML元素我们 ...
- 使用zabbix_agent监控第一台linux服务器
添加zabbix用户和组 groupadd zabbix useradd -g zabbix zabbix 解压并编译安装 tar xf zabbix-3.2.1.tar.gz cd zabbix-3 ...
- Object-C知识点 (三) 单例 蒙版 刷新 KVO底层
#pragma mark - 单例方法(完整的方法) 系统的单例方法名称 sharedApplication defaultManager standardUserDefaults currentDe ...
- iOS 手机时区获取问题
1. 标准的获取时区的正确方法 [NSTimeZone resetSystemTimeZone]; // 重置手机系统的时区 NSInteger offset = [NSTimeZone loca ...
- UGUI 字体背景长度自适应
本文实现以下需求: 在UGUI中 Text为动态添加 要使Text字体背景随着Text的长度而变化 之前还在赞叹UGUI的强大 转念一想,UGUI中好像没有可以实现此功能的组件 也想出了一种办法 把背 ...
- vsftpd配置虚拟用户
#安装vsftpd yum -y install vsftpd #创建本地ftp账户 groupadd ftpuser useradd -g ftpuser -s /sbin/nologin ftpu ...
- Spring HandlerInterceptor
1.Spring HandlerInterceptor 可以组成一个chain. 这个接口有三个方法: public interface HandlerInterceptor { /** * Inte ...
- laravel+vue组合的项目中引入ueditor(打包成组件形式)
前言:最近写东西需要用到ueditor,并且需要是在vue组件中引入. (本博客默认你已经配置了laravel+vue的项目环境,如果还没有配置好的的小伙伴,可以看看我的另一篇博客,链接: http: ...
- hdu_3336: Count the string(KMP dp)
题目链接 题意:求给定字符串中,可以与某一前缀相同的所有子串的数量 做这道题需要明白KMP算法里next[]数组的意义 首先用一数组nex[](这里与之前博客中提到的next明显不同)存储前缀后缀最长 ...