Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用int栈的C++ RPN计算器_C++_Stack_Calculator_Rpn - Fatal编程技术网

使用int栈的C++ RPN计算器

使用int栈的C++ RPN计算器,c++,stack,calculator,rpn,C++,Stack,Calculator,Rpn,我正在尝试编写一个RPN计算器,其中这行输入用于一个简单的示例: 2 3 + 将打印: 5. 然后结束 我需要程序获取输入行,将数字放在堆栈上,查找非数字,检查它们是否是运算符:“+”、“-”、“/”或“*”,如果是,则计算堆栈上最后两个数字的计算,删除这两个数字,然后将新数字添加到堆栈上。这需要从左到右,通过输入行进行解析。此外,如果符号不是运算符之一,则应打印到cout 目前,程序在编译时会在屏幕上转储一长串错误代码 以下是我所拥有的: #include<iostream> #

我正在尝试编写一个RPN计算器,其中这行输入用于一个简单的示例: 2 3 + 将打印: 5. 然后结束

我需要程序获取输入行,将数字放在堆栈上,查找非数字,检查它们是否是运算符:“+”、“-”、“/”或“*”,如果是,则计算堆栈上最后两个数字的计算,删除这两个数字,然后将新数字添加到堆栈上。这需要从左到右,通过输入行进行解析。此外,如果符号不是运算符之一,则应打印到cout

目前,程序在编译时会在屏幕上转储一长串错误代码

以下是我所拥有的:

#include<iostream>
#include<string>
#include<stack>
using namespace std;

int main()
{
 stack<int> num;

 string line;
 int n,count=0,a,b;
 char c;


 while (getline(cin,line))
 {
     for (string::const_iterator it = line.begin(); it != line.end(); ++ it)
     {
         if (isdigit(static_cast<unsigned char>(*it)))
         {
             cout << it << endl;
             n = (it - 48);
             num.push(n);
             count++;
         }
         else if (ispunct(static_cast<unsigned char>(*it)))
         {
             if (it == '+' || it == '-' || it == '/' || it == '*')
             {
                 cout << "count is " << count << endl;
                 if (count>1)
                 {
                    b =  num.top();
                    num.pop();
                    a = num.top();
                    num.pop();

                    if (it == '+')
                    {
                        cout << "+" <<endl;
                        num.push(a+b);
                        count--;
                    }
                    else if (it == '-')
                    {
                        num.push(a-b);
                        count--;
                    }
                    else if (it == '/')
                    {
                        if (b != 0)
                        {
                            num.push(a/b);
                            count--;
                        }
                        else
                        {
                            cout << "division by zero" << endl;
                            return(0);
                        }
                    }
                    else if (it == '*')
                    {
                        num.push(a*b);
                        count--;
                    }
                    else
                    {
                        cout << "invalid input" << endl;
                        return(0);          
                    }
                 }
                 else
                 {
                     cout << "stack underflow" << c << endl;
                     return(0);
                 }
             }
            cout << c << endl;
     }
    }
 }
 while ( !num.empty() )
 {
     cout << num.top() << endl;
     num.pop();
 }
 return 0;
}

若在需要字符的地方用*替换,许多错误可能会消失。将std::const_迭代器与字符进行比较可能是导致编译器出现错误的原因。

在大多数情况下,您缺少解引用运算符星号

您正在使用未初始化的c

别忘了添加
编译器将错误转储到屏幕上

处理这个问题的一般方法是阅读错误,理解他们指出的问题,然后修改程序以纠正问题。如果您不理解错误消息,那么首先要尝试的事情之一是在web上搜索特定的错误消息或错误消息中您不理解的任何特定术语

如果在那次研究之后,您仍然不理解某个特定的错误消息,那么向其他程序员询问该特定错误消息的解释可能是合适的。在这种情况下,您将向他们显示特定的错误消息以及错误所指的源代码行

此外,从头开始很重要,列出第一个错误。这是因为早期的错误可能会混淆编译器,并导致编译器在之后产生更多可能没有意义的错误

您发布的带有错误消息的文档的开头似乎已被截断。错误消息是否填满了控制台缓冲区,因此您丢失了开头

当我使用gcc编译代码时,错误消息以:

 main.cpp: In function 'int main()':
main.cpp:21:22: error: cannot bind 'std::ostream {aka std::basic_ostream<char>}' lvalue to 'std::basic_ostream<char>&&'
              cout << it << endl;
                      ^
如果你从一开始就开始,那么从哪里开始寻找问题就更清楚了

要防止编译器输出在开始时被切断,可以执行以下操作:

如果您的终端允许,增加缓冲区大小或将其设置为无限制 将编译器输出重定向到文件或寻呼机程序,例如。 使用命令(如),以便只获取输出的前几行,其余的将被丢弃。在更正您看到的任何错误后,只需重新编译以查看任何进一步的错误。
那么这个计划有效吗?您的问题是什么?编译器会将错误转储到屏幕上。您需要包括适当的标题,并使用名称空间std;如果这是您想要的。编译器会将错误转储到屏幕上,比如什么错误?编辑您的问题以显示标题。我们不是读心术的人!:-