# Problema con "Espressione di parentesi"

**URL:** <https://forum.olinfo.it/t/problema-con-espressione-di-parentesi/6273>\
**Category:** Aiuto\
**Created:** [2 Settembre 2020, 3:34pm UTC](https://forum.olinfo.it/t/problema-con-espressione-di-parentesi/6273 "2020-09-02T15:34:27Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![M3601](https://forum.olinfo.it/letter_avatar_proxy/v4/letter/m/7ea924/32.png) [@M3601](https://forum.olinfo.it/u/M3601)\
**Post date:** [2 Settembre 2020, 3:34pm UTC](https://forum.olinfo.it/t/problema-con-espressione-di-parentesi/6273/1 "2020-09-02T15:34:27Z")

</div>

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

```auto
#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`:

```auto
#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

---

<div class="post-metadata">

**Author:** ![frakkiobello](https://forum.olinfo.it/user_avatar/forum.olinfo.it/frakkiobello/32/2768_2.png) [@frakkiobello](https://forum.olinfo.it/u/frakkiobello)\
**Post date:** [2 Settembre 2020, 4:12pm UTC](https://forum.olinfo.it/t/problema-con-espressione-di-parentesi/6273/2 "2020-09-02T16:12:04Z")

</div>

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

```auto
1 )

```

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