使用堆栈检查HTML标记的平衡

时间:2012-07-19 00:13:27

标签: c++ stack

我正在尝试编写一个程序,告诉我HTML文件中的所有标记是否均衡,因此每个<tag>都有一个</tag>。我此时并不担心自闭标签。我认为我会有所作为,但并不是很正确。它查看每个元素,而不是整体查找打开和关闭标记。谁能告诉我我做错了什么?

const string opening = "<*>";
const string closing = "</*>";
string input;



int main()
{
    char element;
    stack<char> stk;
    ifstream file;

    cout << "Please Enter File name: ";
         cin >> input;

    //std::file.open(input);

    file.open(input.c_str());

    if(file.fail())
        cout<<"File is corrupt or does not exists!"<<endl;

    while(!file.eof())
    {
        file>>element;

        //push left group symbols onto stack
        if(element==opening[0])
            stk.push(element);
        else if(element==opening[1])
            stk.push(element);
        else if(element==opening[2])
            stk.push(element);

    }
    file.close();
    file.open(input.c_str());
    while(!file.eof())
    {
        file>>element;

        if(stk.top()==opening[0])
        {
            if(element==closing[0])
                stk.pop();
        }
        else if(stk.top()==opening[1])
        {
            if(element==closing[1])
                stk.pop();
        }
        else if(stk.top()==opening[2])
        {
            if(element==closing[2])
                stk.pop();
        }
    }
    file.close();

    if(!stk.empty())
        cout<<"\nILLEGAL"<<endl;
    else if(stk.empty())
        cout<<"\nLEGAL"<<endl;

    cout << "\n\nProgram complete." <<  endl;
    return 0;
}

我对C ++很新,尤其是堆栈,所以请解释一下我可能会学到的答案。

1 个答案:

答案 0 :(得分:0)

我发现了你的错误。你这样说:

 if(stk.top()==opening[0])
    {
        if(element==closing[0])
            stk.pop();
    }
    else if(stk.top()==opening[1])
    {
        if(element==closing[1])
            stk.pop();
    }
    else if(stk.top()==opening[2])
    {
        if(element==closing[2])
            stk.pop();
    }

开启[0] ='&lt;'并关闭[0] ='&lt;'所以没关系。但不幸的是,这对其他角色来说并不适用:

打开[1] ='*'并关闭[1] ='/'

不幸的是,即使我将代码更改为:

 if(stk.top()==opening[0])
    {
        if(element==closing[0])
            stk.pop();
    }
    else if(stk.top()==opening[1])
    {
        if(element==closing[2])
            stk.pop();
    }
    else if(stk.top()==opening[2])
    {
        if(element==closing[3])
            stk.pop();
    }

它仍然不起作用。我会进一步研究它。