c++ - 我正在用 C++ 创建一个计算器,它具有撤消和清除功能。使用堆栈
问题描述
对于我的任务,我需要使用堆栈制作计算器。我得到了加减乘法部分。我基诺撤消我只是弹出堆栈,为了清楚起见,我可以在堆栈顶部添加一个 0,但是每次用户输入 U 或 C 时,程序都会崩溃,因为用户输入应该是 int。
输出:
=>1
2
+
=>3
2
-
=>1
9
*
=>9
9
/
=>1
u
=>9
c
=>0
#include <iostream>
#include <sstream>
#include <stack>
using namespace std;
int add(int a, int b)
{
int x;
x = a + b;
return x;
}
int sub(int a, int b)
{
int x;
x = a - b;
return x;
}
int multi(int a, int b)
{
int x;
x = a * b;
return x;
}
int divide(int a, int b)
{
int x;
x = a / b;
return x;
}
int main()
{
stack<int>math;
char ASMD;
int x = 0;
int a = 0;
int b = 0;
bool control = false;
math.push(x);
cout << "=> " << math.top() << endl;
while (control == false)
{
cin >> b;
cin >> ASMD;
a = math.top();
switch (ASMD)
{
case '+':
{
x = add(a, b);
break;
}
case '-':
{
x = sub(a, b);
break;
}
case '*':
{
x = multi(a, b);
break;
}
case '/':
{
if (b != 0)
{
x = divide(a, b);
break;
}
else
{
cout << "error: can't divide my 0" << endl;
break;
}
}
default:
{
control = true;
break;
}
}
math.push(x);
cout << "=> " << math.top() << endl;
}
return 0;
}
解决方案
如果您想实现一个计算器,请使用 Shutting Yard 算法。该算法的工作方式与交换两个数组中的位置相同,不同之处在于它不是使用单个单元格作为临时存储,而是使用堆栈。最终结果是将人类可读的表达式(中缀符号)符号转换为计算机可执行表达式(后缀符号)。例如,调车场会将这个中缀表达式“1 + 1”翻译成“1 1 +”。后缀表达式存储在堆栈中,并通过从后缀堆栈中弹出元素进行评估,直到到达运算符为止。取运算符并将其应用于已弹出的数字。这是一个超级简短的概述,所以这里有更多:
罗塞塔代码:http ://www.rosettacode.org/wiki/Parsing/Shunting-yard_algorithm 维基:https ://en.wikipedia.org/wiki/Shunting-yard_algorithm
我已经实施了几次,所以如果您需要更多帮助,请询问!
推荐阅读
- python - 如何替换 DataFrame 中的最后一个 empy 行(pandas,python)
- r - 使用 purrr::map 获取 '[.data.frame'(.x, ...) 中的错误:选择了未定义的列'
- kubernetes - 有没有办法仅在使用 Kubernetes 中的 HorizontalPodAutoscaler 处理消息(pod 完成其任务)时缩小 pod?
- c++ - 2个或更多TU中的内联函数的多个定义
- sql-server - 在 SQL 中查找整个重复的发票
- c# - 有没有办法在辅助屏幕中获取未选择的前景窗口的进程 ID
- excel - 如何在 MAC 电脑上将 Excel VBA 导出为 PDF
- python - 如何使用 TensorFlow 2.0 计算分类交叉熵?
- css - Grid Property Similar to Flex-Grow
- netsuite - 使用“高级 PDF/模板”编辑器从保存的搜索构建自定义报告