#include #include const int DIM_MAX = 10; class Pila { public: // Costruttore di default. Pila(); // Distruttore. ~Pila(); // Inserisce l'elemento `x' nella pila. void push(char x); // Estrae un elemento dalla pila. char pop(); // Ritorna `true' se la pila e' vuota; // `false' altrimenti bool empty() const; // Ritorna la capacita' della pila. unsigned int capacita() const; // Ritorna il numero di elementi contenuti nella pila. unsigned int num_elementi() const; private: // Puntatore ad un array di char che rappresenta la pila stessa. char* A; // Indica quanti elementi ci sono nella pila. int top; // Capacita' della pila. int dim; // Raddoppia la dimensione della pila. void raddoppia(); }; // METODI Pila::Pila() { A = new char[DIM_MAX]; top = 0; dim = DIM_MAX; } Pila::~Pila() { delete[] A; } void Pila::push(char x) { if (top == dim) raddoppia(); A[top] = x; ++top; } char Pila::pop() { if (empty()) // Utilizzo `@' come un simbolo speciale // poiche' non sara' mai all'interno di una espressione. return '@'; --top; return A[top]; } bool Pila::empty() const { if (top == 0) return true; else return false; } unsigned int Pila::capacita() const { return dim; } unsigned int Pila::num_elementi() const { return top; } void Pila::raddoppia() { char* tmp = new char[2*dim]; for (int i = 0; i < dim; ++i) tmp[i] = A[i]; delete[] A; dim *= 2; A = tmp; } // FUNZIONI void esamina_parentesi(const string& s) { cout << s << endl; Pila P; for (unsigned int i = 0; i < s.size(); i++) if (s[i] == '(') P.push('('); else if (s[i] == ')') if (P.pop() == '@') cout << "Errata" << endl; if (!P.empty()) cout << "Errata" << endl; } // MAIN int main() { ifstream in_file("espressioni.txt"); if (!in_file) { cerr << "Manca il file ''espressioni.txt''" << endl; return 1; } string s; while (in_file >> s) esamina_parentesi(s); in_file.close(); return 0; }