C++ 在C+中创建后缀计算器+;?

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(不要使用整数除法)。后缀表达

我有一个作业,我需要创建一个后缀计算器。我遇到了一些以前关于这个主题的问题没有充分解决的困难

下面是我想处理的输入示例:

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”类型的未捕获异常。