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

#define MAX_SIZE 100

char stack[MAX_SIZE];
int top = -1;

void push(char item)
{
    if (top >= MAX_SIZE - 1)
    {
        printf("Stack Overflow\n");
        return;
    }
    stack[++top] = item;
}

char pop()
{
    if (top < 0)
    {
        printf("Stack Underflow\n");
        return -1;
    }
    return stack[top--];
}

int precedence(char symbol)
{
    switch (symbol)
    {
    case '^':
        return 3;
    case '*':
    case '/':
        return 2;
    case '+':
    case '-':
        return 1;
    default:
        return 0;
    }
}

void reverse(char *str)
{
    int len = strlen(str);
    int i, j;
    char temp;
    for (i = 0, j = len - 1; i < j; i++, j--)
    {
        temp = str[i];
        str[i] = str[j];
        str[j] = temp;
    }
}

int isalnum(char c)
{
    return ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'));
}

void infixToPrefix(char infix[], char prefix[])
{
    char symbol, temp[2];
    int i, j = 0;

    reverse(infix);

    for (i = 0; infix[i] != '\0'; i++)
    {
        symbol = infix[i];
        if (isalnum(symbol))
        {
            prefix[j++] = symbol;
        }
        else if (symbol == ')')
        {
            push(symbol);
        }
        else if (symbol == '(')
        {
            while ((temp[0] = pop()) != ')')
            {
                prefix[j++] = temp[0];
            }
        }
        else
        {
            while (top > -1 && precedence(stack[top]) > precedence(symbol))
            {
                prefix[j++] = pop();
            }
            push(symbol);
        }
    }

    while (top > -1)
    {
        prefix[j++] = pop();
    }
    prefix[j] = '\0';

    reverse(prefix);
}

int main()
{
    char infix[MAX_SIZE], prefix[MAX_SIZE];
    printf("Enter infix expression: ");
    gets(infix);
    infixToPrefix(infix, prefix);
    printf("Prefix expression: %s\n", prefix);
    return 0;
}
