您现在的位置是:首页 > 正文

C++项目中如何实现一个栈计算器?

2024-02-01 01:55:42阅读 7

写一个栈计算器

写一个栈计算器,设计如下:

  • 支持 +-*/运算

  • 支持后缀输入

例如:

2 3 +

输出:

5

堆操作可以总结如下:

  • push:将一个元素添加到栈顶部

  • pop:从栈顶部移除该元素

  • top: 获取栈顶部元素的值

  • empty: 检查栈是否为空

如何实现呢?

其中最关键两个问题:

1.如何分词

2.如何实现栈

预告:如何写一个简单的短链接程序?

1.如何分词

首先定义好输入是一个字符串,空格风格,我们便可以使用istringstream分割每一个token了,基本框架为:

std::istringstream iss(expression);
std::string token;
while (iss >> token) {
}

2.如何实现栈

对于计算器来说,最核心就是入栈、出栈。

  • 碰到数字入栈

  • 碰到操作符出栈计算

我们便可以写出框架:

if (isNumber(token)) {
  pushNumber(token);
} else if (isOperator(token)) {
  popAndCal(token);
} else {
  throw std::runtime_error("Invalid token in expression.");
}

popAndCal是计算的核心,如:

void popAndCal(const std::string& token) {
  if (operandStack.size() < 2) {
    throw std::runtime_error("Invalid expression.");
  } else {
    double operand2 = operandStack.top();
    operandStack.pop();
    double operand1 = operandStack.top();
    operandStack.pop();
    double result = performOperation(operand1, operand2, token);
    operandStack.push(result);
  }
}

那么我们在栈中变存储了我们想要的结果,最后返回top即可。

是不是很简单,欢迎与我一起探讨。

本节的所有代码已上传星球,感兴趣的可以去里面获取。

c0e3d4f55efbbf59c21e46d78394b8ac.jpeg


网站文章

  • 真的太刺激了,蚂蚁金服难忘的四面经历:Linxu+数据库+数据结构+算法+计算机网络

    真的太刺激了,蚂蚁金服难忘的四面经历:Linxu+数据库+数据结构+算法+计算机网络

    前言 前段时间,蚂蚁金服的热度可不小,互联网圈人人都在讨论它上市的事情,实际上蚂蚁金服上市是迟早的事情。这一下,蚂蚁的员工含金量上升了不少,那我之前蚂蚁提前批这波面经,也是时候分享了。 这次面试,可以...

    2024-02-01 01:55:36
  • Python虚拟环境管理之 pipenv

    Python虚拟环境管理之 pipenv

    创建虚拟环境需要一些工具,本文将会介绍这些工具。 pipenv 是Kenneth Reitz大神的作品,提供Python的各个版本间的管理,各种包管理。

    2024-02-01 01:55:29
  • hua图软件 mac_新入手Mac系统需要做的两件事

    hua图软件 mac_新入手Mac系统需要做的两件事

    最近有小伙伴们提问,新买的Mac 电脑,想要下载点软件,要么下载了软件提示:“xxx”因为出现问题而无法打开。请与开发者联系,还有的小伙伴是这样的提示“xxx.app已损坏,打不开。您应该将它移到废纸...

    2024-02-01 01:55:03
  • Git实操大全(最全操作)

    Git实操大全(最全操作)

    目录1.git常用命令1.1用户签名在此文件中查看(全局的)1.2 git init初始化本地库1.3 git status查看本地库1.4 git add 添加到暂存区1.5 添加到本地库 git ...

    2024-02-01 01:54:56
  • Liunx安装MySQL解压版

    liunx安装解压版教程;

    2024-02-01 01:54:49
  • 【C++】类与类之间的 5 种关系

    【C++】类与类之间的 5 种关系

    该文章就是简要的总结一下面向对象的:类与类之间的关系,熟悉类与类之间的关系,能够帮助我们更好的设计出合理的类;: A继承B,说明A is B;

    2024-02-01 01:54:20
  • vue中element-ui下拉框数据改变后,页面不刷新问题

    vue中element-ui下拉框数据改变后,页面不刷新问题

    vue中element-ui下拉框数据改变后,页面不刷新问题

    2024-02-01 01:54:14
  • css多张图片一行显示居中,【CSS技巧】多图片的垂直居中排版

    css多张图片一行显示居中,【CSS技巧】多图片的垂直居中排版

    多图片的垂直居中排版,比如相册中相片的缩略图展示页,如图所示:先看效果:代码如下:============================-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd“>无标题文档.box{ width:232px; height...

    2024-02-01 01:54:08
  • merge改写update

    1.OLD:需求将HH2中的data_object_id同步至HH中。UPDATEHHASETDATA_OBJECT_ID=(SE...

    2024-02-01 01:54:04
  • HCIP 实验作业(ppp实验)

    HCIP 实验作业(ppp实验)

    主验证方:配置用户列表及验证方式。主验证方:配置用户列表及验证方式。主验证方:配置用户列表及验证方式。将实际接口加入虚拟接口组;将实际接口加入虚拟接口组;被验证方:配置验证用户名。被验证方:配置验证用户名。被验证方:配置验证用户名。

    2024-02-01 01:53:33