博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基于C++实现带parser功能的计算器
阅读量:2032 次
发布时间:2019-04-28

本文共 1775 字,大约阅读时间需要 5 分钟。

前一阵子复习STL的时候,结合轮子哥的教程做了一下基于Stack的带parser功能的计算器。具体功能就是输入带括号的四则运算,比如”(1+2)*3+2”,程序可以自动parser,并得出最后的结果为11。

现在直接贴代码,具体的注释都在里面~

#include 
#include
#include
#include
using namespace std;// 基于Stack构建计算器(带括号等等)// ① Item类 存储数据和操作符// ② 出入Push和Pop函数// ③ Calculate函数——里面有一个Stack
的堆和 stringstream,用于分析每个字符形式// ④ Run函数——实现具体计算struct Item { int number = 0; char op = '\0'; // 默认的构造函数 Item() {} Item(char operators): op{operators} {}};// Run返回的栈顶的最上面两个元素的和,保存在第二高的栈顶元素上。并把最高的栈顶元素出栈。void Run(stack
& items){ auto second = items.top(); items.pop(); auto& first = items.top().number; switch (second.op) { case '+': first += second.number; break; case '-': first -= second.number; break; case '*': first *= second.number; break; case '/': first /= second.number; break; }}void Push(stack
& items, int number) { items.top().number = number; switch (items.top().op) { // 只要运算符为*或者/,都执行Run(items) case '*':case '/': Run(items); }}int Pop(stack
& items){ while (items.top().op != '\0') { // 根据Run可以看出,真正实现出栈操作的stack.pop()是在 // Run函数里面完成的。 Run(items); } /*4*/ // pop()没有返回值 auto number = items.top().number; items.pop(); return number;}int Calculate(string text){ stringstream ss(text); stack
items; // 栈初始化的时候,就往里面添加一个item items.push({}); while (true) { // ss.peek 查看下一字符,但不提取 char op = ss.peek(); switch (op) { case '(': // 相当于items.push(Item {}); items.push({}); break; case ')': Push(items, Pop(items)); break; case '+':case '-':case '*':case '/': items.push({op}); break; } if (isdigit(op)) { int number; ss >> number; Push(items, number); } else if (ss.eof()) // 到头了——>string stream到达末尾 { return Pop(items); } else { ss.ignore(); } }}int main() { auto item = Calculate("(1+2)*3+2"); cout << item << endl; // 输出的应该为11}

转载地址:http://mvxaf.baihongyu.com/

你可能感兴趣的文章
cookie被禁止后怎样使用session的解决方案
查看>>
Eclipse 部分快捷键失效解决
查看>>
Bootstrap 自定义弹框
查看>>
MyBatis 分页插件 PageHelper 使用方法
查看>>
AbstractQueuedSynchronizer 源码分析
查看>>
分布式以客户为中心的一致性
查看>>
java 注解
查看>>
CAS:乐观锁实现
查看>>
压力测试工具Apache ab
查看>>
Linux - Shell
查看>>
MySQL 如何执行关联查询
查看>>
算法运行时间n3,n2, n, nlogn对比
查看>>
java 中的suppressedException
查看>>
Rope --高效字符串处理数据结构
查看>>
Gap buffer -- 一个数据结构为可编辑的文本
查看>>
X/Open DTP模型,两阶段提交,JTA接口定义
查看>>
MySql binlog 日志
查看>>
spring 事务管理
查看>>
Redis集群
查看>>
线程中实现不可中断的任务
查看>>