Debug Assertion失败c ++ deque迭代器无法解除引用

时间:2015-12-03 19:03:35

标签: c++

我希望我的代码使用中缀来改变前缀。当输入为3 + 5时,输出应为35+。但是当我键入" 3 + 5" t程序在控制台屏幕上显示3然后弹出错误。错误说" Debug Assertion失败!... microsoft visual studio10.0 \ vc \ include \ deque line:338 表达式:" Deque迭代器不可解除错误当我点击"忽略"弹出另一个错误。 " Debug Assertion Failed!... microsoft visual studio10.0 \ vc \ include \ deque line:339 表达式:"标准c ++库超出范围" && 0 这是我的代码:

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

决定优先级的功能

int priority(char a)
{
int prio=-1;
if(a=='+'||a=='-')
    prio=1;
else if(a=='*'||a=='/')
    prio=2;
else if(a=='^')
    prio=3;
else if(a=='(')
    prio=4;
return prio;
}

void main()
{int i=0,j=0;
int control=0;
string infix;
stack<char> ostack;
vector<char> temp;
cin>>infix;

for(i=0;i<infix.length();i++)
    {
  

如果是我要打印的数字

    if(isdigit(infix[i]))
    {
        cout<<infix[i];
    }
  

如果是数学符号我想检查哪一个

    else if(infix[i]=='+' || infix[i]=='-' || infix[i]=='*' || infix[i]=='/' || infix[i]=='^' || infix[i]=='(')
    {
        if(priority(infix[i])>priority(ostack.top()) || ostack.empty())
        {
            ostack.push(infix[i]);
        }
        else if(priority(infix[i])<=priority(ostack.top()))
        {    
            while(!ostack.empty())
            {
            temp.push_back(ostack.top());
            cout<<ostack.top();
            ostack.pop();
            }
        control++;
        }
        else if(control=1)
        {
        ostack.push(infix[i]);
        }
        else if(infix[i]==')')
        {
            while(ostack.top()!='(')
            {
                cout<<ostack.top();
                ostack.pop();
            }
        }


    }
control=0;
    }
while(!ostack.empty())
{
cout<<ostack.top();
ostack.pop();
}
system("pause");
}

问题出在main函数的第一个 else if 语句中。当我调试时,那里没有问题。但是当我按下(第35行(第14行)中的&#34; Step Into&#34; 按钮时只读文件弹出和显示

reference operator[](size_type _Off)
        {   // subscript mutable sequence
 #if _ITERATOR_DEBUG_LEVEL == 2

        if (this->_Mysize <= _Off)

            _DEBUG_ERROR("string subscript out of range");

 #elif _ITERATOR_DEBUG_LEVEL == 1
        _SCL_SECURE_VALIDATE_RANGE(_Off < this->_Mysize);
 #endif /* _ITERATOR_DEBUG_LEVEL == 2 */

        return (_Myptr()[_Off]);
        }

我在 for 语句中更改了它现在可以正常工作但有错误。代码现在看起来像这样。当我输入 3 * 5-7 / 9 时。输出为35 * 79 /。但它应该是35 * 79 /-.

for(i=0;i<infix.length();i++)
    {
        if(ostack.empty() && !isdigit(infix[i]))
            ostack.push(infix[i]);
    else if(isdigit(infix[i]))
    {
        cout<<infix[i];
    }
    else if(infix[i]=='+' || infix[i]=='-' || infix[i]=='*' || infix[i]=='/' || infix[i]=='^' || infix[i]=='(')
    {
        if(priority(infix[i])>priority(ostack.top()))
        {
            ostack.push(infix[i]);
        }
        else if(priority(infix[i])<=priority(ostack.top()))
        {    
            while(!ostack.empty())
            {
            temp.push_back(ostack.top());
            cout<<ostack.top();
            ostack.pop();
            }
        control++;
        }
        else if(control=1)
        {
        ostack.push(infix[i]);
        }
        else if(infix[i]==')')
        {
            while(ostack.top()!='(')
            {
                cout<<ostack.top();
                ostack.pop();
            }
        }


    }
control=0;
    }

1 个答案:

答案 0 :(得分:1)

您的代码中的这种情况

if (priority(infix[i]) > priority(ostack.top()) || ostack.empty())

已经表明代码已被破坏。

如果ostack有可能是空的(并且存在,因为您正在检查它),那么调用ostack.top()是非法的。显然,这正是您的代码尝试做的事情。

如果您想检查ostack是否为空,请确保在调用ostack.top()之前执行此操作,而不是

if (ostack.empty() || priority(infix[i]) > priority(ostack.top()))

具体而言(!),而不是相反。