Ho scritto un codice, e tra l'altro colgo l'occasione, se avete voglia, di dirmi se va bene o meno, e se si può migliorare.
A titolo puramente didattico, vorrei scrivere la versione ricorsiva.
La ricorsione l'ho affrontata, ma mai nello specifico.
Non voglio che me la scriviate voi, ma solo consigli e dritte: non conviene per quel caso, oppure si, snellisce tutto ecc.
So che la ricorsione, come detto da un utente, spesso toglie dai guai...esempio apertura di sottocartelle nella lettura/creazione di sottodirectory.
Ma so anche che ci sono pareri (e pareri che pesano (M_A_W) ) che è tendenzialmente contro la ricorsione.
Comunque, mi basterebbe per ora un ok sul codice. L'ho rifatto un paio di volte per via di casi particolari dove veniva scritto espressione ok, quando invece non lo era
Ora sembra esente da bugs.
Magari provate anche voi e se notate errori segnalatemelo per favore
Ecco:
Codice: Seleziona tutto
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N 500
int analizza (char input[],char stack[],int top,int len);
void input_char (char str_input[],int n);
void push (char exp,char stack[],int *top);
int pop (char exp,char stack[],int *top);
void push(char exp,char stack[],int *top)
{
(*top)++;
stack[*top]=exp;
}
int pop(char exp,char stack[],int *top)
{
int flag=0;
if (stack[*top]=='(' && exp==')')
{
flag++;
(*top)--;
}
if (stack[*top]=='[' && exp==']')
{
flag++;
(*top)--;
}
if (stack[*top]=='{' && exp=='}')
{
flag++;
(*top)--;
}
return flag;
}
int analizza (char input[],char stack[],int top,int len)
{
int i,res_pop;
for (i=0; i<len; i++)
{
if (input[i]=='(' || input[i]=='[' || input[i]=='{')
{
push(input[i],stack,&top);
}
if (input[i]==')' || input[i]==']' || input[i]=='}')
{
if ( (res_pop=pop(input[i],stack,&top))==0)
return 0;
}
}
return top;
}
void input_char(char str_input[],int n)
{
int len;
fgets(str_input,n,stdin);
len=strlen(str_input);
str_input[len-1]='\0';
}
int main(void)
{
char input[N];
char stack[N]={0};
int top=-1;
int len,res;
puts ("input frase : ");
input_char(input,N);
printf ("Espressione da valutare:%s\n", input);
len=strlen(input);
res=(analizza(input,stack,top,len));
if(res==-1)
{
puts("Espressione regolare");
}
else
{
puts("Espressione non regolare");
}
return 0;
}

