使用Stack检查正确HTML标记的C ++程序

时间:2017-09-25 04:54:08

标签: c++ data-structures stack

我一直在尝试在我的数据结构教科书上遵循示例代码。 这是一个使用堆栈检查C ++中括号的平衡但是没有按预期工作的程序。不知怎的,我遇到了HTML标记匹配算法的问题。

#include <iostream>
#include <stack>
#include <vector>
#include <string>
using namespace std;

vector<string> getHtmlTags() {                                      //receives a string of html tags and divide them by "<, >"
    vector<string> tags;                                            //vector of html tags
    while (cin) {                                                   //reads the whole input
        string line;
        getline (cin,line);
        int pos = 0;                                                //current scanning position
        int ts = line.find("<",pos);                                //scans from the current scanning position
        while (ts!=string::npos) {                                  //repeat until end of string
            int te = line.find(">", ts+1);                          //scans for the end of a tag (<)
            tags.push_back(line.substr(ts,te-ts+1));                //save tag to the vector
            pos = te + 1;                                           //repositioning
            ts = line.find("<",pos);
        }
    }
    return tags;                                                    //return vector of tags
}


bool isHtmlMatched(const vector<string>& tags) {                    //checks if the html tags are correctly matched
    stack<string> S;                                            //implememted stack from above for opening tags
    typedef vector<string>::const_iterator Iter;                    //iterate through vector

    for (Iter p = tags.begin(); p != tags.end(); ++p) {             
        if (p->at(1) != '/')                                        //is it the opening tag?
            S.push(*p);                                             //push to the stack
        else{
            if (S.empty()) return false;                            //there is nothing to match
            string open = S.top().substr(1);                        //opening tag excluding '<'
            string close = p->substr(2);                            //closing tag excluding '>'
            if (open.compare(close) != 0) return false;             //exception for fail to match
            else S.pop();                                           //pop matched element

        }
    }
    if (S.empty()) return true;                                     //everything has matched correctly - Correct
    else return false;                                              //some did not match correctly - Incorrect
}

int main() {

    int rep;                                                        //decides the number of trial
    cin >> rep;

    for (int i=1; i<=rep; i++) {                                    //loop up to the decided trial
        if(isHtmlMatched(getHtmlTags()))
            cout << "Correct" << endl;
        else cout << "Incorrect" << endl;
    }
}

它在没有编译错误的情况下运行,但由于某种原因,在我抛出HTML标记列表后控制台没有响应。 我想请求帮助改进这些代码。任何想法都表示赞赏。

1 个答案:

答案 0 :(得分:0)

  

它在没有编译错误的情况下运行,但由于某种原因,在我抛出HTML标记列表后控制台没有响应。

它为我运行,它显示了我尝试的几个测试用例的正确输出。 我使用的输入是:

1
<html>
<head></head>
<body></body>
</html>

你有没有忘记在实际输入html标签之前输入一个int? 如果没有,你能表明你的意见吗?