【发布时间】:2018-06-21 11:16:01
【问题描述】:
我的程序目标是将给定的数学表达式转换为波兰符号。 数学表达式存储在向量中,并使用递归。
编译时出现运行时错误。 使用调试器会显示分段错误 (SIGSEGV)。
假设输入的形式为(a+b),对应的输出为ab+。 (括号必填)
其实是SPOJ的this problem。
我的做法如下——
使用向量来存储表达式
如果表达式大小大于 1
然后使用 pop_back 和 vector::erase 删除总是出现在字符串末尾的括号。
将向量分为三部分——字符串1、运算符和字符串2(字符串1和字符串2是向量)
使用递归将向量字符串 1 和字符串 2 简化为波兰符号
清除传递给函数的原始向量并将字符串 1 、运算符和字符串 2 添加到它。
change() 用于完成所有这些事情
这是我的程序,它将单个语句转换为它的波兰符号。
#include <iostream>
#include <vector>
void convert(std::vector <char> &vect)
{
if(vect.size()!=1&&vect.size()!=0)
{
vect.pop_back();
vect.erase(vect.begin());
std::vector<char> str1;
std::vector<char> str2;
char op;
int i=0;
int reqcount = 0;
while(1)
{
if(vect[i]=='(')
reqcount++ ;
if(vect[i]==')')
reqcount-- ;
str1.push_back(vect[i]);
if(!reqcount)
break;
i++;
}
op=vect[i];
while((i+1)!=vect.size())
{
str2.push_back(vect[i+1]);
i++;
}
vect.clear();
convert(str1);
convert(str2);
for(int i=0; i<str1.size(); i++ )
{
vect.push_back(str1[i]);
}
vect.push_back(op);
for(int i=0;i<str2.size();i++)
{
vect.push_back(str2[i]);
}
}
}
int main( void )
{
std::vector<char> testinput;;
char c;
std::cin>>std::noskipws;
while(std::cin>>c&&c!='\n')
testinput.push_back(c);
convert(testinput);
for(int i=0;i<testinput.size();i++)
std::cout<<testinput[i];
return 0;
}
【问题讨论】:
-
"...编译时出现分段错误。(SIGSEGV)..." 不,您遇到运行时错误,请使用调试器查找。
-
你忘了处理空的
vect。 -
对不起。已将分段错误更改为运行时错误。
-
包括空 vect 的情况,但我认为当 vect 为空时不会出现这种情况,除非输入为空。
标签: c++ vector segmentation-fault runtime-error