0
#include <iostream>
#include <stack>
#include <string>

using namespace std;

int main()
{
    string blah("512+4*+3−");
    stack<int> astack;
    int a=0;
    int b=0;
    int result=0;
    int final=0;
    for (string::iterator count=blah.begin(); count != blah.end(); count=count+1)
    {
        if (isdigit(*count))
        {
            astack.push(*count);
            cout<<" "<<*count<<" ";
        }   
        else
        {
            a=astack.top();
            astack.pop();
            b=astack.top();
            astack.pop();
            if(*count=='+')
            {
                result = a+ b;
            }
            else if (*count=='-')
            {
                result=a-b;
            }
            else if(*count=='*')
            {
                result=a*b;
            }   
            astack.push(result);    
        }
    }       
    final=astack.top();
    cout<<final;
}

我的问题是每当我运行它时,代码似乎都会出现分段错误。当我尝试用操作员评论它运行它时,堆栈似乎弹出两个值,我不太确定为什么

4

2 回答 2

1

正如 PaulMcKenzie 指出的那样,字符串中的减号blah是某种奇怪的 unicode 字符,看起来像普通的减号,但事实并非如此。由于它是一些奇怪的 unicode 字符,它实际上存储在字符串内存中的一个以上字节中,这意味着您的迭代器 for-loop 的迭代次数比您预期的要多!

在你声明后放一个cout << blah.length() << endl;右边blah,你会看到长度超过了预期的 9 个字符。

此外,即使上述问题得到解决,该程序也不会输出正确答案。在对它们进行任何计算之前,您需要将您的 ascii 数字字符(在整数范围 [48,57] 内)转换为等效的整数值。

于 2014-11-03T02:44:43.447 回答
1

如果您发布的代码是实际代码,那么您发布的字符串存在问题。

string blah("512+4*+3−");

之后的最后一个字符3不是 ASCII 减号。它是一个 Unicode 字符0x2212。将其更改为 ASCII 减号并重新运行程序。

可能发生的情况是,您从 ASCII 减号开始,将文本复制到另一个应用程序,然后该应用程序尝试通过将减号替换为更具美感的字符来“修饰”减号。然后,您可能已将此应用程序中的文本复制回您的源代码编辑器。

于 2014-11-03T02:45:03.423 回答