我希望我的代码使用中缀来改变前缀。当输入为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;
}
答案 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()))
具体而言(!),而不是相反。