如何正确解析算术表达式中的数字,区分正数和负数?

2023-12-03

我在数据结构类中有一个作业,其中我必须编写一个计算器,用 4 个基本运算和括号来求解算术表达式,输入是通过 stdin 缓冲区完成的,输出也是如此。

一开始很简单,老师给我们提供了算法(如何将表达式从中缀转换为后缀以及如何对其求值),唯一的目标是让我们实现自己的堆栈并使用它,但是计算器它本身并不能很好地工作,我认为这是因为我的解析器。

这是算法和我的代码,用于解析数字、运算符和括号,同时将它们放入数组中,以便以以后更容易计算的方式存储表达式。

// saida is an array of pairs of integers, the first value of the pair is the value of the info (the number itself or the ASCII value of the operator)
// The second value is an indicator of whether it is a number or a operator
for (i = 0; i < exp_size; i++) {
    c = expression[i];

    // If the current char is a digit, store it into a helper string and keep going until a non-digit is found
    // Then atoi() is used to transform this string into an int and then store it.
    if (c >= '0' && c <= '9') {
        j = 1, k = i+1;
        tempInt[0] = c;
        while(expression[k] >= '0' && expression[k] <= '9') {
            tempInt[j++] = expression[k];
            k++;
        }
        tempInt[j] = '\0';
        saida[saidaIndex][0] = atoi(tempInt);
        saida[saidaIndex++][1] = 0;
        i = k-1;
    }

    // If the character is an operator, the algorithm is followed.
    else if (c == '+' || c == '-' || c == '*' || c == '/') {
        while(pilha->size > 0 && isOpBigger( stack_top(pilha), c )) {
            saida[saidaIndex][0] = stack_pop(pilha);
            saida[saidaIndex++][1] = 1;
        }
        stack_push(c, pilha);
    }
    else if (c == '(') stack_push(c, pilha);
    else if (c == ')') {
        j = stack_pop(pilha);
        while(j != '(') {
            saida[saidaIndex][0] = j;
            saida[saidaIndex++][1] = 1;
            j = stack_pop(pilha);
        }
    }
}

问题是,在这段代码中我无法判断减号是否表示减法运算符或负数(我知道减号运算符是与负数相加,但这并没有帮助我解决这个问题) ,我想到了以下内容,但没有成功:

  • 每次出现减号时,存储一个加号,并让下一个数字本身 * -1。如果下一个数字已经是负数或者减号位于带有括号的表达式(例如 1 + 2 - (3 * 4))之前,则不起作用。
  • 如果减号后面有空格,则为运算符,如果没有,则为负数。不起作用,因为输入上没有这些规则。

我没有任何口译经验,我真的不知道如何进行。该代码可以完美地处理没有负数的有效表达式,但不能处理像 () + 3 - () 这样的奇怪表达式,但这是另一个问题。

谢谢你的帮助。


这就是所谓的“一元减”问题,在您的情况下(没有变量)可以通过替换来解决。

运营商-是一元减号,如果是

  • 前面有一个左括号
  • 前面有另一个运算符
  • 输入的第一个字符

现在而不是存储-你存储一个不同的字符,比如m并为其指定比其他运算符更高的优先级(或者与求幂运算符相同,如果有的话)。

另一个提示:不要使用空格来表示任何内容,算术表达式必须在没有任何空格的情况下工作,否则它是不正确的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何正确解析算术表达式中的数字,区分正数和负数? 的相关文章

  • 是否可以强制 XMLWriter 将元素写入单引号中?

    这是我的代码 var ptFirstName tboxFirstName Text writer WriteAttributeString first ptFirstName 请注意 即使我使用 ptFirstName 也会以双引号结束 p
  • linux perf:如何解释和查找热点

    我尝试了linux perf https perf wiki kernel org index php Main Page今天很实用 但在解释其结果时遇到了困难 我习惯了 valgrind 的 callgrind 这当然是与基于采样的 pe
  • 将布尔参数传递给 SQL Server 存储过程

    我早些时候问过这个问题 我以为我找到了问题所在 但我没有 我在将布尔参数传递给存储过程时遇到问题 这是我的 C 代码 public bool upload false protected void showDate object sende
  • WPF 中的调度程序和异步等待

    我正在尝试学习 WPF C 中的异步编程 但我陷入了异步编程和使用调度程序的困境 它们是不同的还是在相同的场景中使用 我愿意简短地回答这个问题 以免含糊不清 因为我知道我混淆了 WPF 中的概念和函数 但还不足以在功能上正确使用它 我在这里
  • 指针问题(仅在发布版本中)

    不确定如何描述这一点 但我在这里 由于某种原因 当尝试创建我的游戏的发布版本进行测试时 它的敌人创建方面不起作用 Enemies e level1 3 e level1 0 Enemies sdlLib 500 2 3 128 250 32
  • C#:如何防止主窗体过早显示

    在我的 main 方法中 我像往常一样启动主窗体 Application EnableVisualStyles Application SetCompatibleTextRenderingDefault false Application
  • 将目录压缩为单个文件的方法有哪些

    不知道怎么问 所以我会解释一下情况 我需要存储一些压缩文件 最初的想法是创建一个文件夹并存储所需数量的压缩文件 并创建一个文件来保存有关每个压缩文件的数据 但是 我不被允许创建许多文件 只能有一个 我决定创建一个压缩文件 其中包含有关进一步
  • C 预处理器库

    我的任务是开发源分析工具C程序 并且我需要在分析本身之前预处理代码 我想知道什么是最好的图书馆 我需要一些重量轻 便于携带的东西 与其推出自己的 为什么不使用cpp这是的一部分gcc suite http gcc gnu org onlin
  • 在 ASP.NET Core 3.1 中使用包含“System.Web.HttpContext”的旧项目

    我们有一些用 Net Framework编写的遗留项目 应该由由ASP NET Core3 1编写的API项目使用 问题是这些遗留项目正在使用 System Web HttpContext 您知道它不再存在于 net core 中 现在我们
  • 如何将图像路径保存到Live Tile的WP8本地文件夹

    我正在更新我的 Windows Phone 应用程序以使用新的 WP8 文件存储 API 本地文件夹 而不是 WP7 API 隔离存储文件 旧的工作方法 这是我如何成功地将图像保存到 共享 ShellContent文件夹使用隔离存储文件方法
  • vector 超出范围后不清除内存

    我遇到了以下问题 我不确定我是否错了或者它是一个非常奇怪的错误 我填充了一个巨大的字符串数组 并希望在某个点将其清除 这是一个最小的例子 include
  • Github Action 在运行可执行文件时卡住

    我正在尝试设置运行google tests on a C repository using Github Actions正在运行的Windows Latest 构建过程完成 但是当运行测试时 它被卡住并且不执行从生成的可执行文件Visual
  • 如何衡量两个字符串之间的相似度? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 给定两个字符串text1 and text2 public SOMEUSABLERETURNTYPE Compare string t
  • Qt表格小部件,删除行的按钮

    我有一个 QTableWidget 对于所有行 我将一列的 setCellWidget 设置为按钮 我想将此按钮连接到删除该行的函数 我尝试了这段代码 它不起作用 因为如果我只是单击按钮 我不会将当前行设置为按钮的行 ui gt table
  • 实体框架 4 DB 优先依赖注入?

    我更喜欢创建自己的数据库 设置索引 唯一约束等 使用 edmx 实体框架设计器 从数据库生成域模型是轻而易举的事 现在我有兴趣使用依赖注入来设置一些存储库 我查看了 StackOverflow 上的一些文章和帖子 似乎重点关注代码优先方法
  • C++ fmt 库,仅使用格式说明符格式化单个参数

    使用 C fmt 库 并给定一个裸格式说明符 有没有办法使用它来格式化单个参数 example std string str magic format 2f 1 23 current method template
  • 如何让Gtk+窗口背景透明?

    我想让 Gtk 窗口的背景透明 以便只有窗口中的小部件可见 我找到了一些教程 http mikehearn wordpress com 2006 03 26 gtk windows with alpha channels https web
  • C - 直接从键盘缓冲区读取

    这是C语言中的一个问题 如何直接读取键盘缓冲区中的数据 我想直接访问数据并将其存储在变量中 变量应该是什么数据类型 我需要它用于我们研究所目前正在开发的操作系统 它被称为 ICS OS 我不太清楚具体细节 它在 x86 32 位机器上运行
  • const、span 和迭代器的问题

    我尝试编写一个按索引迭代容器的迭代器 AIt and a const It两者都允许更改容器的内容 AConst it and a const Const it两者都禁止更改容器的内容 之后 我尝试写一个span
  • 如何在 C++ BOOST 中像图形一样加载 TIFF 图像

    我想要加载一个 tiff 图像 带有带有浮点值的像素的 GEOTIFF 例如 boost C 中的图形 我是 C 的新手 我的目标是使用从源 A 到目标 B 的双向 Dijkstra 来获得更高的性能 Boost GIL load tiif

随机推荐

  • WPF中如何实现标签页控件的延迟绑定?

    我有一个实体类 该实体有很多属性 并且实体的数据以多种方式向用户显示TabItems of a TabControl 我还实现了 MVVM 方法 当屏幕首先向用户显示时 我只想绑定活动选项卡页控件 并且当用户浏览选项卡页时 将根据需要产生额
  • CSS 中图像 URL 上的缓存破坏器是否会导致额外请求?

    如果我在 CSS 的一条规则中将缓存破坏器添加到图像 URL background url img sprite png version 20130205 no repeat 75px 208px 但同一个CSS有其他版本的URL 没有缓存
  • 从位置读取文件

    FileStream infile new FileStream C Users John Desktop ProjectNew nov txt FileMode Open FileAccess Read int position x Le
  • 对 AtomicReference 持有的对象执行 equals 和 hashcode 的正确方法

    AtomicReference不适用于Objects equals and Objects hash AtomicReference
  • TensorFlow Custom Estimator 预测投掷值误差

    注意 这个问题有一个附带的 记录的Colab笔记本 有时 TensorFlow 的文档还有很多不足之处 一些针对较低级别 api 的旧文档似乎已被删除 而大多数较新的文档都指向使用较高级别的 api 例如 TensorFlow 的子集ker
  • 为什么插入到复制数据帧的新列也会添加到原始数据帧? [复制]

    这个问题在这里已经有答案了 您能否告诉我为什么要开设新专栏c添加到原始数据框 即df old df old pd DataFrame a 1 2 b 3 4 df new df old df new c 5 6 print Old prin
  • 如何按类别、值和选中对复选框进行排序

    我有一个div subfilterNamesContainer 其中包含复选框列表 我正在尝试编写一个函数 将复选框分为 3 个部分 复选框与class default 应该位于按值排序的顶部 无论是否选中 然后我需要列出不是的复选框cla
  • 如何从 appsettings.json 获取值

    public class Bar public static readonly string Foo ConfigurationManager AppSettings Foo 在 NET Framework 4 x 中 我可以使用Confi
  • 如何使用 C++11 枚举类作为标志

    假设我有一堂课 enum class Flags char FLAG 1 1 FLAG 2 2 FLAG 3 4 FLAG 4 8 现在我可以有一个具有类型标志的变量并分配一个值吗7例如 我可以这样做吗 Flags f Flags FLAG
  • AJAX 呼叫在 Phonegap 中无法工作,但工作正常

    我正在使用开放天气地图 api web 服务进行 ajax 调用 以便使用纬度和经度获取当前天气 问题是相同的调用在我的正常 php 文件夹中工作 但在我的 phongap 应用程序中不起作用 我的ajax调用如下图 ajax type G
  • Hibernate 限制中“等于 id”限制的大小写敏感

    我尝试做一个区分大小写的等于username与 Hibernate 3 6 9 一起使用 但似乎限制不区分大小写 例如 AdMin 或 admin 都有效 但只有 admin 应该正确 否则 size 应该返回 0 我会尽量避免使用like
  • 使类可编码

    我有一个协议 即 Codable 和一个类 即 Codable public protocol SourceListItem AnyObject Codable var name String get set var children So
  • 如何将事件侦听器添加到 HTML5 视频海报图像加载事件

    是否可以 我想将一个事件侦听器附加到 HTML5 视频元素上的海报图像 以便在加载并显示海报图像后运行代码 我正在尝试找出一种方法来做到这一点 但我需要帮助 像这样 var poster video prop poster if poste
  • 将现有 EC2 实例导出到 CloudFormation json/yaml

    Problem 我有一个EC2实例正在运行 我对实例做了一些修改 安装了 docker 设置证书目录等 现在 我想创建相同的实例 但使用基础设施作为代码主体 我没有记住我所做的所有添加并手动创建模板 而是尝试找到一种方法将当前的 EC2 实
  • 检查数据库是否存在并在 SQLite IOS 中删除数据库

    我目前正在使用phonegap 来创建ios 应用程序 在熟悉 sql javascript 交互的同时 我似乎已经创建了同名数据库文件的 10 个版本 我目前正在使用以下创建代码 来自phonegap wiki var mydb fals
  • Promise 回调按什么顺序触发?

    假设以下语句已按此顺序执行 promiseA then function console log A1 promiseB then function console log B promiseA then function console
  • 获取BehaviorSubject的值

    我正在尝试获取BehaviorSubject 的值 返回值 但我如何利用它们在 return true false 语句中使用它们 BehaviorSubject isScalar false observers Array 0 close
  • 在 php 中运行多个查询

    我对 PHP 和 HTML 真的很陌生 按提交按钮后 我尝试使用 Users MySQL 表中已有的数据填充字段 这有效 我还想将通过 SELECT 获得的相同数据插入到另一个名为 scan 的 SQL 表中
  • 为什么 HTML 中 标签没有关闭?

    出于好奇 为什么 img gt 标签未关闭于HTML img src smiley gif alt Smiley face height 42 width 42 我还注意到 img gt 标签明确地封闭在XHTML img src smil
  • 如何正确解析算术表达式中的数字,区分正数和负数?

    我在数据结构类中有一个作业 其中我必须编写一个计算器 用 4 个基本运算和括号来求解算术表达式 输入是通过 stdin 缓冲区完成的 输出也是如此 一开始很简单 老师给我们提供了算法 如何将表达式从中缀转换为后缀以及如何对其求值 唯一的目标