调试断言失败的c++deque迭代器不可取消引用

Debug Assertion Failed c++ deque iterator not dereferencable

本文关键字:不可取 可取消 引用 迭代器 c++deque 断言 失败 调试      更新时间:2023-10-16

我希望我的代码进行中缀到前缀的更改。当输入是3+5时,输出应该是35+。然而,当我键入"3+5"t时,程序在控制台屏幕上显示3,然后弹出一个错误。Error says"Debug Assertion Failed!…microsoft visual studio10.0\vc\include\dequeline:338Expression:"当我单击"ignore"时,deque迭代器不可取消引用另一个错误弹出"调试断言失败!…microsoft visual studio10.0\vc\include\deque行: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");
}

问题出现在主函数中的第一个else-if语句处。当我调试时,直到那里都没有问题。但是,当我按下(第35行(第14行))的"Step Into"按钮时,另一个只读文件弹出并显示

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

代码中的此条件

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

已经是代码被破坏的直接指示。

如果ostack可能是空的(而且确实存在,因为您正在检查它),那么调用ostack.top()是非法的。显然,这正是你的代码想要做的

如果你想检查ostack是否为空,你必须确保在调用ostack.top()之前,而不是在之后

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

按照这个顺序(!),而不是相反。