funKatz
funKatz

Reputation: 33

C++ Program for Checking Correct HTML Tag Using Stack

I have been trying to follow an example code on my data structure textbook. It is a program to check balance of parenthesis in C++ using a stack but it is not working as expected. Somehow I am having a problem with HTML tag matching algorithm.

#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;
    }
}

It runs without a compilation error, but for some reason the console does not respond after I throw a list of HTML tags. I would like to ask for help for improving these codes. Any ideas are appreciated.

Upvotes: 1

Views: 4824

Answers (1)

Ankit Arora
Ankit Arora

Reputation: 140

It runs without a compilation error, but for some reason the console does not respond after I throw a list of HTML tags.

It runs for me and it is showing correct output for a couple of test cases I tried. The input I used was:

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

Did you by any chance forget to input an int before actually entering the html tags? If not, can you show your input?

Upvotes: 1

Related Questions