用堆栈和迭代器编写后缀计算器

时间:2014-11-03 02:17:46

标签: c++ postfix-operator

#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;
}

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

2 个答案:

答案 0 :(得分:1)

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

在声明cout << blah.length() << endl;后立即放置blah,您将看到长度超过预期的9个字符。

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

答案 1 :(得分:1)

如果您发布的代码是实际代码,那么您发布的字符串就会出现问题。

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

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

可能发生的事情是你开始使用ASCII减号,将文本复制到另一个应用程序,并且应用程序试图通过用更美观的角色替换它来“淡化”减号。然后,您可能已将此应用程序中的文本复制回源代码编辑器。