2017-09-25 4 views
0

J'ai essayé de suivre un exemple de code sur mon manuel de structure de données. C'est un programme pour vérifier l'équilibre des parenthèses en C++ en utilisant une pile mais cela ne fonctionne pas comme prévu. D'une certaine façon, j'ai un problème avec l'algorithme de correspondance de balises HTML. Il fonctionne sans une erreur de compilation, mais pour une raison quelconque, la console ne répond pas après avoir lancé une liste de balises HTML. Programme C++ pour la vérification d'une balise HTML correcte à l'aide de la pile

#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; 
    } 
} 
Je voudrais demander de l'aide pour améliorer ces codes. Toutes les idées sont appréciées.

+0

https://github.com/nileshivam/Incomplete-HTML-code-completer – Nilesh

+0

@Nilesh Référez-vous au code PHP pour un analyseur HTML C++ brut? Bon sang, je vous conseille de regarder dans les analyseurs XML qui existent déjà dans l'écosystème C++. Si vous essayez simplement de le faire en tant qu'exercice, je vous conseillerais de recommencer avec une idée un peu plus claire de l'objectif de l'application. – SeedyROM

Répondre

0

Il fonctionne sans une erreur de compilation, mais pour une raison quelconque, la console ne répond pas après avoir lancé une liste de balises HTML.

Il fonctionne pour moi et il montre la sortie correcte pour un couple de cas de test que j'ai essayé. L'entrée était je:

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

vous at par hasard oublier d'entrer un int avant d'entrer réellement les balises html? Si non, pouvez-vous montrer votre contribution?