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.
https://github.com/nileshivam/Incomplete-HTML-code-completer – Nilesh
@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