/* =============================================================================================
   Wilfredo Cruz Yarlequé                              wcruzy@gmail.com
   Piura, Perú, Octubre 04 de 2019
   
   Uso de una pila para evaluar expresiones aritmeticas post fijo
   ============================================================================================= */

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

void menu(void);

void main()
{
	char expresion[500];	// Expresion algebraica
	int s[100];		// arreglo de cien caracteres
	int top;		// puntero al tope de la pila
	int opcion;		// opcion del menu
	int largo;		// longitud de la expresion algebraica
	int i, temp;

	menu();			// lista las opciones del menu

	printf("\nOpcion: ");
	scanf("%d", &opcion);

	while (opcion != 3)
	{
		switch(opcion)
		{
		case 1 : 	// Lectura de expresion aritmetica
			printf("Ingrese expresion aritmetica:\n");
			scanf("%s", expresion);
			break;
		case 2 : 	// Evaluar expresion
			top=0;
			printf("\n\nExpresion a evaluar:\n%s\n", expresion);
			largo = strlen(expresion);
			for (i = 0; i < largo; i++)
			{
				if (expresion[i] != '+' && expresion[i] != '-' && expresion[i] != '*' && expresion[i] != '/')
				{
					top++;
					s[top]=(int)(expresion[i])-48;
				}
				else
				{
					switch (expresion[i])
					{
					case '+':
						temp=s[top-1]+s[top];
						top--;
						s[top]=temp;
						break;
					case '-':
						temp=s[top-1]-s[top];
						top--;
						s[top]=temp;
						break;
					case '*':
						temp=s[top-1]*s[top];
						top--;
						s[top]=temp;
						break;
					case '/':
						if(s[top-1] != 0)
							temp=s[top-1]/s[top];
						else
							temp=0;
						top--;
						s[top]=temp;
						break;
					default:
						printf("\nOperador no valido...\n");
						break;
					}
				}
			}

			if (top > 0)
				printf("\n\nResultado: %d\n\n\n", s[top]);
			else
				printf("\n\n**>> Expresion NO correcta...<<**\n\n\n");
			break;
		default :
			printf("\nOpcion no valida...\n");
			break;
		}

		printf("\n\nOpcion: ");
		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 expresion aritmetica\n"
	"2 : Evaluar expresion\n"
	"3 : Salir del programa\n"
	"----------------------------------------\n"
	"\n");

	return;
}