在 cstring 中搜索运算符
searching cstring for operators
对于作业,我们得到一个反向抛光符号的方程。对于此示例,我将使用: 2 3 8 * + $
$
用于表示表达式的结尾。使用堆栈,我们输出答案。
我一直在使用:
getline(cin, input, '&');
input.c_str();
读取等式,然后将其转换为c_string,以便我可以查看输入中的各个元素。
之后,我需要检查一些事情。 如果元素是数字,我需要将其推送到堆栈上。 如果是空白,我需要跳过它。
if (isdigit(input[i]))
{
push();
i++;
}
else if (isspace(input[i]))
{
i++;
}
现在就是让我卡住的原因。 如果我命中一个运算符(在本例中是*
),我需要从堆栈中弹出前两个元素并"操作它们"并将结果推回堆栈。 但是,我不知道有什么东西可以让我认识到他们是运营商。这可能是一个愚蠢的问题,但帮助将不胜感激。
您可以创建一个函数映射,并匹配运算符
std::map<char, void (*)(char *)> operators;
operators['*'] = &mult;
operators['+'] = &add;
...
并在您的条件陈述中
if (isdigit(input[i]))
{
push();
i++;
}
else if (isspace(input[i]))
{
i++;
}
else if (operators.find(input[i]) != operators.end())
{
operators[input[i]](input);
}
这样,您将能够轻松地将新运算符添加到计算器中。
只有大约 4 或 5 个运算符。 使用以下内容检查它们:
if (input[i] == '*') {...}
嗯,没有"内置"的方法。我只会写一个IsOperator(char ch)函数。然后执行以下操作:
int IsOperator(char ch)
{
// either add more operators or use a table, etc. here
if (ch == '+' || ch == '-' || ch == '/' || ch == '*')
return 1;
return 0;
}
如果你有多字符运算符,比如'==',它会变得有点复杂,因为你必须提前偷看,但想法是一样的。
如果您正在编写反向抛光符号计算器,那么在堆栈上您只有数字,或者像您的示例中那样的数字。顺便说一句,你不接受多位数的数字吗?
考虑两种情况,在这两种情况下,您只需要std::stack<int> numbers;
:
- 你有数字字符
c
- 只需将数字放在堆栈上:
法典:
numbers,push(c - '0');
- 你有运算符,假设"+",你用它们的总和替换前两个数字:
法典:
if (numbers.size() < 2) {
throw std::runtime_error("Too little numbers for +");
}
int a = numbers.top();
numbers.pop();
numbers.top() += a;
- 你有'$',检查堆栈上是否只有一个数字,结果是:
法典:
if (numbers.size() != 1) {
throw std::runtime_error("There should be only one!");
}
int result = numbers.top();
numbers.pop();
相关文章:
- 为什么比较运算符如此快速
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 有根的二进制搜索树.保留与其父级的链接
- 增量运算符与后缀混淆
- 一个关于在C++中重载布尔运算符的问题
- 运算符C++ "delete []"仅删除 2 个前值
- 正在尝试重载二进制搜索树分配运算符
- 运算符重载搜索概念
- 错误 C2676;在C++的二叉搜索树类中定义 ++ 运算符时遇到问题
- 二叉搜索树<<运算符重载不起作用
- 在 cstring 中搜索运算符
- 使用二进制搜索树重载运算符
- 二叉搜索树赋值运算符
- std::ostringstream 运算符重载搜索顺序
- 使用==运算符搜索矢量
- C++ 使用正则表达式搜索"正则表达式运算符"
- 使用二叉搜索树定义运算符 == 和运算符>时出错
- 具有非布尔运算符的高维搜索树