我想通过使用堆栈检查括号是否平衡,例如,如果我为每个打开的括号输入(()),那么在它之前有一个封闭的括号; 但每次cout都不平衡。 我无法找到我的代码有什么问题。
ANYKEY
答案 0 :(得分:0)
您只在main()中分配一个字符:
char *a=new char;
以后你用
破坏你的堆 cin>>a[i];
每个i> 0
你应该分配一些最大量的字符:
int main()
{
char a[1000];
int sizeofmyarray;
cout<<"enter size:";
cin>>sizeofmyarray;
if (sizeofmyarray > 1000) {
cout<<"too big";
return -1;
}
cout<<"enter array:";
for(int i=0;i<sizeofmyarray;i++)
{
cin>>a[i];
}
if(balancedbracket(a,sizeofmyarray))
cout<<"is balanced";
else
cout<<"not balanced";
}
答案 1 :(得分:0)
这是一个简单的错误,您实际上并没有在开始时将节点指针k设置为零(NULL),因此您将以非零指针结束并将其视为国家的标志&#34;不平衡&#34;。
delete
也没有将指针设置为NULL。 删除和删除[]不要将其参数设置为零。 这是因为参数可以是指针算术的结果,例如在引用数组时。
您没有足够的内存来存储数组:
int main()
{
int sizeofmyarray;
cout<<"enter size:";
cin>>sizeofmyarray;
char *a=new char[sizeofmyarray];
更好地使用字符串或矢量......类似的东西
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::string;
struct node
{
char data ;
node* link;
};
bool pop(node* &top, char val)
{
if(top==NULL)
return false;
else
val=top->data;
node* temp=top;
top=top->link;
delete temp;
return true;
}
bool push (node* &top, char val)
{
node* newtop;
try {
newtop = new node;
}
catch(std::bad_alloc&)
{
return false;
}
newtop->data=val;
newtop->link=top;
top=newtop;
return true;
}
bool balancedbracket(string s)
{
node* k = NULL; //!!! never leave it uninitialized
if (s[0]==')')
return false;
for(int i=0;i<s.length();i++)
{
if(s[i]=='(')
{
push(k,'(');
}
else if (s[i]==')')
{
pop(k,'('); // do we really need this argument?
}
}
return k==NULL;
}
int main()
{
string str;
cout << "enter array:";
std::getline(cin,str);
if(balancedbracket(str))
cout<<"is balanced\n";
else
cout<<"not balanced\n";
system("pause");
}
我在那里解决的其他问题很少,代码仍然是最好的实现,但有一些有用的。例如,不建议使用整个命名空间
这里唯一真正的算法错误:node* k;
balancedbracket()
使用node* k = NULL;
的原始程序将起作用,但它会损坏其内存,但在它到达redzone的末尾之前,不会引发segfault \ exception-5。
enter size:6
enter array:(.)(.)
is balancedДля продолжения нажмите любую клавишу . . .
enter size:6
enter array:(())((
not balancedДля продолжения нажмите любую клавишу . . .