Problema con "Espressione di parentesi"

Sottoponendo il codice di seguito ottengo che la metà dei testcase errati per signal 11:

#include <bits/stdc++.h>
using namespace std;
int main() {
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
    int N;
    cin >> N;
    string E;
    cin >> E;
    const string dict = "<([{>)]}";
    // vettore contenente gli indici delle parentesi rispetto alla stringa dict
    vector<int> e;
    for (auto p : E)
        e.push_back(dict.find(p));
    stack<int> parentesi;
    bool corretta = true;
    for (auto p : e) {
        if (p < 4)
            parentesi.push(p);
        else {
            corretta = (parentesi.top() == p - 4);
            parentesi.pop();
        }
        if (!corretta)
            break;
    }
    cout << (corretta && parentesi.empty() ? "corretta" : "malformata");
    return 0;
}

Riscrivendo il codice e utilizzando un vector come stack riesco a ottenere 70/100 con due testcase che risultano signal 11:

#include <bits/stdc++.h>
using namespace std;
int main() {
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
    int N;
    cin >> N;
    string E;
    cin >> E;
    const string dict = "<([{>)]}";
    vector<int> e, parentesi;
    for (auto p : E)
        e.push_back(dict.find(p));
    bool corretta = true;
    for (auto p : e) {
        if (p < 4)
            parentesi.push_back(p);
        else {
            corretta = (parentesi.back() == p - 4);
            parentesi.pop_back();
        }
        if (!corretta)
            break;
    }
    cout << (corretta && parentesi.empty() ? "corretta" : "malformata");
    return 0;
}

Sinceramente non riesco a capire il problema.
Qualche soluzione?

Grazie in anticipo

L’errore sta nel fatto che potresti effettuare un parentesi.back(); quando parentesi è vuota. Il caso più semplice in cui accade è con il testcase:

1 )

Basta che controlli che parentesi non sia vuota prima di usarla (nel caso in cui lo fosse allora la stringa è malformata).