C++ 平衡支架C和x2B+;不工作,我做错了什么 #包括 #包括 使用名称空间std; main() { int i,j=0,perlen,countcp=0,countsp=0,countrp=0,countcl=0,countsl=0,countrl=0; str序列,str1; 不能
这条线C++ 平衡支架C和x2B+;不工作,我做错了什么 #包括 #包括 使用名称空间std; main() { int i,j=0,perlen,countcp=0,countsp=0,countrp=0,countcl=0,countsl=0,countrl=0; str序列,str1; 不能,c++,string,brackets,balance,C++,String,Brackets,Balance,这条线 #include<iostream> #include<string> using namespace std; main() { int i, j=0, perlen, countcp=0, countsp=0, countrp=0, countcl=0, countsl=0, countrl=0; string str, str1; cout<<"Please enter string"<<endl;
#include<iostream>
#include<string>
using namespace std;
main()
{
int i, j=0, perlen, countcp=0, countsp=0, countrp=0, countcl=0, countsl=0, countrl=0;
string str, str1;
cout<<"Please enter string"<<endl;
getline(cin, str);
perlen=(str.length())/2;
for(i=0; i<str.length(); i++)
{
if(str[i]=='{')
countcp++;
if(str[i]=='[')
countsp++;
if(str[i]=='(')
countrp++;
if(str[i]=='}')
countcl++;
if(str[i]==']')
countsl++;
if(str[i]==')')
countrl++;
}
str1=str;
if(countcp==countcl and countsp==countsl and countrp==countrl)
{
cout<<"equal"<<endl;
int countwhile=0, j=0;
while(!str.length()==0)
{
if(str[j]=='{' and str[j+1]=='}')
{
str.erase(i, 2);
countwhile++;
}
else if(str[j]=='(' and str[j+1]==')')
{
str.erase(i, 2);
countwhile++;
}
else if(str[j]=='[' and str[j+1]==']')
{
str.erase(i, 2);
countwhile++;
}
if(countwhile>perlen)
{
countwhile=1;
cout<<"reached break"<<endl;
break;
}
j++;
}
if(countwhile==1)
{
cout<<"Balanced string "<<str1<<endl;
}
}
}
似乎是错误的,因为i
不是循环的一部分。i
等于str.length();
,这会导致擦除失败
你是说
str.erase(i, 2);
我看到的问题:
main
中缺少返回类型。请使用:
str.erase(j, 2);
int main() ...
这还不够。您还需要确保访问str
时不会超出范围。因此,请将其更改为:
while ( !str.length() == 0 )
使用
j
的值。假设str
等于“{()}”。当j等于1时,您试图从字符串中删除()。之后,
str等于“{}”。为了能够处理该问题,您需要将j
的值设置为0
。逻辑需要为:
当没有匹配项时,增量j
。
当存在匹配且删除匹配字符时,减量j
i
和j
使用无符号类型以避免编译器警告
您可以使用:
str.erase(j, 2);
// ^^
更新版本的,同时使用上述修复循环
我还添加了额外的cout
行来帮助诊断逻辑错误
std::string::size_type i = 0;
std::string::size_type j = 0;
int countwhile=0;
std::string::size_type j=0;
而(!str.length()==0&&j+1 所以这段时间应该是这样的
int countwhile=0;
std::string::size_type j=0;
while(!str.length()==0 && j+1 < str.length())
{
if(str[j]=='{' and str[j+1]=='}')
{
cout<<"erasing {}"<<endl;
str.erase(j, 2);
cout << str << endl;
countwhile++;
--j;
}
else if(str[j]=='(' and str[j+1]==')')
{
cout<<"erasing ()"<<endl;
str.erase(j, 2);
cout << str << endl;
countwhile++;
--j;
}
else if(str[j]=='[' and str[j+1]==']')
{
cout<<"erasing []"<<endl;
str.erase(j, 2);
cout << str << endl;
countwhile++;
--j;
}
else
{
j++;
}
if(countwhile>perlen)
{
countwhile=1;
cout<<"reached break"<<endl;
break;
}
}
while(!str.length()==0和j+1perlen)
{
countwhile=1;
coutExplain失败的情况您应该使用调试器检查代码并逐行检查代码。这可能比在这里问一个不清楚的问题更有效。您只检查str[j]
和str[j+1]
。我建议更好地使用堆栈处理此que。您的while条件永远不会变为零。是的,我的意思是j thnx寻求帮助,但现在我在抛出“std::out\u of_range”what()实例后调用了一个错误terminate:基本\u字符串::擦除已中止(内核转储)我想你需要在每次擦除后将j
设置回零。或者可能将其设置为-1
,因为你以后有一个j++
。这个想法必须是在每次擦除匹配对时重新开始。是的,这是我忘记将j设置为零的问题。现在它正在工作,非常感谢你现在它工作。我仍在测试它是否工作正常在对({})进行了所有编辑之后,它对({})有效,但对({{}})无效.@Dementor,你需要使用不同的策略和算法来处理这些输入。在更新程序之前,你必须花一些时间用铅笔和纸处理这些输入。@R Sahu,我正在匹配相邻的括号。为什么failing@Dementor不,你不是。仔细看。
str.erase(j, 2);
// ^^
std::string::size_type i = 0;
std::string::size_type j = 0;
int countwhile=0;
std::string::size_type j=0;
while(!str.length()==0 && j+1 < str.length())
{
if(str[j]=='{' and str[j+1]=='}')
{
cout<<"erasing {}"<<endl;
str.erase(j, 2);
cout << str << endl;
countwhile++;
--j;
}
else if(str[j]=='(' and str[j+1]==')')
{
cout<<"erasing ()"<<endl;
str.erase(j, 2);
cout << str << endl;
countwhile++;
--j;
}
else if(str[j]=='[' and str[j+1]==']')
{
cout<<"erasing []"<<endl;
str.erase(j, 2);
cout << str << endl;
countwhile++;
--j;
}
else
{
j++;
}
if(countwhile>perlen)
{
countwhile=1;
cout<<"reached break"<<endl;
break;
}
}
while(!str.length()==0 and j+1 < str.length())
{
if(str[j]=='{' and str[j+1]=='}')
{
str.erase(j, 2);
countwhile++;
j--;
}
else if(str[j]=='(' and str[j+1]==')')
{
str.erase(j, 2);
countwhile++;
j--;
}
else if(str[j]=='[' and str[j+1]==']')
{
str.erase(j, 2);
countwhile++;
j--;
}
else
{
j++;
}
if(countwhile>perlen)
{
countwhile=1;
cout<<"reached break"<<endl;
}
if(countwhile==1)
{
cout<<"Balanced string "<<str1<<endl;
break;
}
else
{
cout<<"not Balanced "<<str1<<endl;
break;
}
}