/* =============================================================================================
   Wilfredo Cruz Yarlequé                              wcruzy@gmail.com
   Piura, Perú, Octubre 04 de 2019
   
   Uso de una pila para evaluar paréntesis en expresion algebraica
   ============================================================================================= */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>

void menu(void);

void imprimeCaracter(int);

void main()
{
	char expresion[500];	// Expresión algebraica
	char s[100]; 		// arreglo de cien caracteres
	int top; 		// puntero al tope de la pila
	int opcion; 		// opción del menu
	int largo; 		// longitud de la expresión algebraica
	bool ok; 		// Valor boolean para expresión correcta
	int i;

	menu();			// lista las opciones del menú

	printf("Opción: ");
	scanf("%d", &opcion);

	while (opcion != 3)
	{
		switch(opcion)
		{
			case 1 : // Lectura de expresión algebraica
				printf("Ingrese expresión algebraica:\n");
				scanf("%s", expresion);
				printf("Expresión leída:\n%s\n\n", expresion);
				break;
			case 2 : // Revisión de paréntesis
				top = 0;
				ok = true;
				printf("\nRevisión de paréntesis\n");
				printf("Expresión a revisar:\n%s\n", expresion);
				largo = strlen(expresion);
				for (i = 0; i <= largo; i++)
				{
					if (expresion[i] == '(')
					{
						s[top+1] = expresion[i];
						top++;
					}
					else
					{
						if (expresion[i] == ')')
						{
							top--;
							if (top < 0)
								ok = false;
						}
					}
					imprimeCaracter(top);
				}
				if (top == 0 && ok)
					printf("\nExpresión CORRECTA... %d\n\n\n", top);
				else
					printf("\n**>> Expresión NO correcta... %d <<**\n\n\n", top);
				break;
			default :
				printf("\nOpción no válida...\n");
				break;
		}
		printf("Opción: ");
		scanf("%d", &opcion);
	}
	printf("\nFin del programa...\n");
	return;
}

// Despliega las opciones del menu
void menu(void)
{
	printf("\n\n"
	       "----------------------------------------\n"
	       "Ingrese una de las siguientes opciones: \n"
	       "----------------------------------------\n"
	       "1 : Ingresar expresión algebraica\n"
	       "2 : Revisión de paréntesis\n"
	       "3 : Salir del programa\n"
	       "----------------------------------------\n"
	       "\n");
	return;
}

// Imprime despues de evaluar caracter de expresión
void imprimeCaracter(int top)
{
	if (top == 0)
		printf(" ");
	else
	{
		if (top > 0)
			printf(".");
		else
			printf("$");
	}

	return;
}