Espressione di parentesi

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.

#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;
}

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;
    }