平衡括号

时间:2016-11-26 16:31:32

标签: c++ visual-c++

我想通过使用堆栈检查括号是否平衡,例如,如果我为每个打开的括号输入(()),那么在它之前有一个封闭的括号; 但每次cout都不平衡。 我无法找到我的代码有什么问题。

ANYKEY

2 个答案:

答案 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Для продолжения нажмите любую клавишу . . .