C++ 在C+中创建后缀计算器+;?
我有一个作业,我需要创建一个后缀计算器。我遇到了一些以前关于这个主题的问题没有充分解决的困难 下面是我想处理的输入示例: 12.6+ 二,* [回车] 结果:36 任务说明: 我们通常使用的算术表达式是中缀表达式,这意味着运算符出现在其两个操作数之间,如“4+5”中所示。在后缀表达式中,运算符出现在其操作数之后,如“4 5+”。这里有一个稍微复杂一点的后缀表达式:“25 12 7-2*/”。等价的中缀表达式是:“25/((12-7)*2)”。该表达式的结果应为2.5(不要使用整数除法)。后缀表达式不需要括号 编写一个使用堆栈计算后缀表达式的程序。 每个输入表达式应在其自己的行中输入,并且 当用户输入空行时,程序应终止。唯一的 表达式中的符号将是+、-、*、/、数字和空格 提示:从左到右读取后缀表达式。当你读一本书时 编号,将其推到堆栈上。读取操作数时,弹出顶部 从堆栈中删除两个数字,对其应用运算符,然后按 结果位于堆栈顶部。最后,表达式的结果 应该是堆栈上的唯一数字 以下是我目前的代码:C++ 在C+中创建后缀计算器+;?,c++,linked-list,postfix-notation,C++,Linked List,Postfix Notation,我有一个作业,我需要创建一个后缀计算器。我遇到了一些以前关于这个主题的问题没有充分解决的困难 下面是我想处理的输入示例: 12.6+ 二,* [回车] 结果:36 任务说明: 我们通常使用的算术表达式是中缀表达式,这意味着运算符出现在其两个操作数之间,如“4+5”中所示。在后缀表达式中,运算符出现在其操作数之后,如“4 5+”。这里有一个稍微复杂一点的后缀表达式:“25 12 7-2*/”。等价的中缀表达式是:“25/((12-7)*2)”。该表达式的结果应为2.5(不要使用整数除法)。后缀表达
#include <list> /* Linked Lists */
#include <stack> /* Stacks */
#include <iostream> /* cout cin */
int main() {
std::stack< double, std::list<double> > postfixStack;
std::string input;
std::cout << "Enter a postfix expression: ";
std::getline(std::cin, input);
while (input != "") {
std::cout << "Input expression: " << input << std::endl;
for (int i = 0; i<input.length()-1; i++) {
if (input.compare(i, 1, " ")) { // should ignore spaces, but doesn't
std::cout << "Skipping element " << i << " \n";
} else if (static_cast<int>(input[i]) == input[i]) { // push numbers onto the stack
postfixStack.push(static_cast<double>(input[i]));
std::cout << "Pushing " << input[i] << " onto the stack.\n";
} else if (input.compare(i, 1, "+")) { // pop two numbers off the stack (1), apply the operator to them (2), and push that onto the stack (3)
double operand1 = postfixStack.top();
postfixStack.pop();
double operand2 = postfixStack.top();
postfixStack.pop();
postfixStack.push(operand1 + operand2);
std::cout << "Adding " << operand1 << " and " << operand2 << std::endl;
}
}
std::getline(std::cin, input);
}
if (!postfixStack.empty()) {
std::cout << "Result of expression: " << postfixStack.top() << std::endl;
} else {
std::cout << "It appears that you did not enter an expression to evaluate.\n";
}
return 0;
}
#包含/*链接列表*/
#包括/*个堆栈*/
#包括/*cout cin*/
int main(){
std::stackpostfix堆栈;
std::字符串输入;
标准::cout
我的while循环应该允许每个规范有多行输入
您已经找到了getline
。您可以简单地使用它来阅读整行内容。您采用的方法看起来不错
我试图跳过循环中的空格,但是我的条件似乎跳过了任何不是空格的内容
没错。您正在检查的结果,但结果不是布尔值,非零并不意味着字符串相等,而是意味着它们不相等
顺便说一句,您执行比较的方式并不常见,更常见的是将字符与'
进行比较,或者使用或可能使用
检查字符串下标意味着我只能使用一位数的数字,这绝对不是我想要的
是的。当你看到一个数字时,你可以进入一个嵌套的循环来读取所有后续的数字。基本大小写,一个一位数的字符串,被简单地转换成一个数字。(但比你想象的稍微简单一点,请看下面的注释。)如果你知道如何确定一个N位数字符串的值(比如说ABC
),您可以通过乘以10并添加下一个数字的值来确定N+1位字符串的值(例如ABCD
)
注意:static\u cast(输入[i])==input[i]
始终为真。这并不表示您认为它的意思。请使用调试器检查static\u cast(输入[i])的值
查找一些字符,并尝试了解此强制转换的作用。当您了解此强制转换的作用时,请考虑您可以执行的另一项检查,以及在检查字符是否为数字后,如何使用该检查来确定该数字的数值。std::istringstream
是您的朋友。啊!我的意思是ion,这是家庭作业:没有stringstream或boost。哦。那么,逐行阅读,逐个字符解析字符串。谢谢!我将compare与isspace进行了交换,这看起来好多了。我还使用std::stod对我的数字进行了强制转换,因为静态强制转换会给我带来错误。最后,我替换了静态强制转换条件(为什么我认为这是一个好主意?)使用isdigit并制定了一个成功连接数字的解决方案。不过,当我的调试器到达“+”条件时,我似乎得到了一个“终止于std::out_of_range:basic_string”类型的未捕获异常。