# Espressione di parentesi

**URL:** <https://forum.olinfo.it/t/espressione-di-parentesi/4521>\
**Category:** Aiuto\
**Created:** [24 Marzo 2017, 9:30pm UTC](https://forum.olinfo.it/t/espressione-di-parentesi/4521 "2017-03-24T21:30:46Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![Keyword](https://forum.olinfo.it/letter_avatar_proxy/v4/letter/k/ebca7d/32.png) [@Keyword](https://forum.olinfo.it/u/Keyword)\
**Post date:** [24 Marzo 2017, 9:30pm UTC](https://forum.olinfo.it/t/espressione-di-parentesi/4521/1 "2017-03-24T21:30:46Z")

</div>

Ciao ragazzi, qualcuno che mi potrebbe aiutare?  
Non capisco dove sia l’errore, ottengo 80/100, mi fallisce nel secondo testcase dove mi dice in alcuni outputs, execution killed with signal 11.

```auto
#include <iostream>
#include <fstream>
#include <stack>
using namespace std;

int n;
char e[10001];
int aperte = 0,chiuse = 0;
bool espressione()
{
    stack<int> p;
    for(int i = 0;i<n;i++)
    {
        switch(e[i]){
            case '(':
            case '[':
            case '{':
            case '<':
                p.push(e[i]);
                break;
            case ')':
                if(p.top() == '(')p.pop();
                else return false;
                break;
            case ']':
                if(p.top() == '[')p.pop();
                else return false;
                break;
            case '}':
                if(p.top() == '{')p.pop();
                else return false;
                break;
            case '>':
                if(p.top() == '<')p.pop();
                else return false;
                break;
            default:
                break;
        }
    }
    if(p.empty()) return true;
    else return false;
}
int main()
{
    ifstream in("input.txt");
    ofstream out("output.txt");
    in>>n;

    for(int i = 0;i<n;i++)
    {
       in>>e[i];
       switch(e[i]){
            case '(':
            case '[':
            case '{':
            case '<':
                aperte++;
                break;
            case ')':
            case ']':
            case '}':
            case '>':
                chiuse++;
                break;
            default:
                break;
       }
    }
    if(aperte == chiuse)
    {
        
        if(espressione())
            out<<"corretta\n";
        else out<<"malformata\n";
        
    }else
        out<<"malformata\n";
    return 0;
}

```

---

<div class="post-metadata">

**Author:** ![aldo.carrolo](https://forum.olinfo.it/letter_avatar_proxy/v4/letter/a/3ab097/32.png) [@aldo.carrolo](https://forum.olinfo.it/u/aldo.carrolo)\
**Post date:** [26 Marzo 2017, 9:14pm UTC](https://forum.olinfo.it/t/espressione-di-parentesi/4521/2 "2017-03-26T21:14:30Z")

</div>

L’errore che avviene è il seguente:  
Se esegui il seguente input `())` il tuo codice darebbe errore. Questo poichè non controlli, durante una parentesi chiusa, se lo stack sia vuoto o meno.  
Dovresti modificare soltanto lo switch in questo modo:

```
    switch(e[i]){
        case '(':
        case '[':
        case '{':
        case '<':
            p.push(e[i]);
            break;
        case ')':
            if(!p.empty() && p.top() == '(')p.pop();
            else return false;
            break;
        case ']':
            if(!p.empty() && p.top() == '[')p.pop();
            else return false;
            break;
        case '}':
            if(!p.empty() && p.top() == '{')p.pop();
            else return false;
            break;
        case '>':
            if(!p.empty() && p.top() == '<')p.pop();
            else return false;
            break;
        default:
            break;
    }
```
