The program:
- evaluates postfix and prefix expressions
- reverse a string
- parenthesis balancing
- decimal to binary conversion
- infix to postfix conversion
There a some extra characters (emojis) appended in the output. I would like to fix that.
Also I have used two pop functions with int and char return type how can I reduce it to one single function.
This a first year college project.
#include <stdio.h>
#include <ctype.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#define MAX 20
int stack[MAX], opp1, opp2, top = -1;
struct stack
{
    char stck[20];
    int top;
}
s;
void push(int x)
{
    top++;
    stack[top] = x;
}
int pop()
{
    char c;
    c = stack[top];
    top = top - 1;
    printf("%c", c);
}
char pop1()
{
    if (top == -1)
        return -1;
    else
        return stack[top--];
}
void postfixeval()
{
    char postfix[20];
    int res, i;
    gets(postfix);
    for (i = 0; postfix[i] != '\0'; i++)
    {
        if (isdigit(postfix[i]))
        {
            push(postfix[i] - 48);
        }
        else
        {
            opp2 = pop();
            opp1 = pop();
            switch (postfix[i])
            {
                case '+':
                    push(opp1 + opp2);
                    break;
                case '-':
                    push(opp1 - opp2);
                    break;
                case '*':
                    push(opp1 *opp2);
                    break;
                case '/':
                    push(opp1 / opp2);
                    break;
                case '^':
                    res = pow(opp1, opp2);
                    break;
            }
        }
    }
    printf("result is %d \n", pop());
}
void prefixeval()
{
    int len;
    char prefix[20];
    int res, i;
    gets(prefix);
    len = strlen(prefix);
    for (i = len - 1; i >= 0; i--)
    {
        if (isdigit(prefix[i]))
        {
            push(prefix[i] - 48);
        }
        else
        {
            opp1 = pop();
            opp2 = pop();
            switch (prefix[i])
            {
                case '+':
                    push(opp1 + opp2);
                    break;
                case '-':
                    push(opp1 - opp2);
                    break;
                case '*':
                    push(opp1 *opp2);
                    break;
                case '/':
                    push(opp1 / opp2);
                    break;
                case '^':
                    res = pow(opp1, opp2);
                    push(res);
                    break;
            }
        }
    }
    printf("result is %d \n", pop());
}
int match(char a, char b)
{
    if (a == '[' && b == ']')
        return 1;
    if (a == '{' && b == '}')
        return 1;
    if (a == '(' && b == ')')
        return 1;
}
int check(char exp[])
{
    int i;
    char temp;
    for (i = 0; i < strlen(exp); i++)
    {
        if (exp[i] == '(' || exp[i] == '{' || exp[i] == '[')
            push(exp[i]);
        if (exp[i] == ')' || exp[i] == '}' || exp[i] == ']')
            if (top == -1)
            {
                return 0;
            }
        else
        {
            temp = pop();
            if (!match(temp, exp[i]))
            {
                printf("Mismatched parentheses are : ");
                printf("%c and %c\n", temp, exp[i]);
                return 0;
            }
        }
    }
    if (top == -1)
    {
        printf("Balanced Parentheses\n");
        return 1;
    }
    else
    {
        return 0;
    }
}
void dectobin(int n)
{
    while (n != 0)
    {
        push(n % 2);
        n = n / 2;
    }
    while (top != -1)
    {
        printf("%d", pop());
    }
}
int priority(char x)
{
    if (x == '(')
        return 0;
    if (x == '+' || x == '-')
        return 1;
    if (x == '*' || x == '/')
        return 2;
}
void intopost()
{
    char exp[100];
    char *e, x;
    printf("Enter the expression : \n");
    scanf("%s", exp);
    printf("\n");
    e = exp;
    while (*e != '\0')
    {
        if (isalnum(*e))
            printf("%c ", *e);
        else if (*e == '(')
            push(*e);
        else if (*e == ')')
        {
            while ((x = pop1()) != '(')
                printf("%c ", x);
        }
        else
        {
            while (priority(stack[top]) >= priority(*e))
                printf("%c ", pop1());
            push(*e);
        }
        e++;
    }
    while (top != -1)
    {
        printf("%c ", pop1());
    }
}
int main()
{
    int ch, i, len;
    char postfix[20], prefix[20], str[30];
    do {
        printf("\n----STACK APPLICATIONS----\n");
        printf("1.postfix expression evaluation\n2.prefix expression evaluation\n3.reverse a string\n4.paranthesis balancing\n5.decimal to binary\n6.infix to postfix\n7.exit\n");
        printf("enter choice");
        scanf("%d", &ch);
        switch (ch)
        {
            case 1:
                {
                    printf("enter postfix expression\n");
                    scanf("%c", &postfix);
                    postfixeval();
                    break;
                }
            case 2:
                {
                    printf("enter prefix expression\n");
                    scanf("%c", prefix);
                    prefixeval();
                    break;
                }
            case 3:
                {
                    printf("enter string\n");
                    scanf("%s", str);
                    len = strlen(str);
                    for (i = 0; i < len; i++)
                    {
                        push(str[i]);
                    }
                    printf("reversed string is:");
                    for (i = 0; i < len; i++)
                    {
                        pop();
                    }
                    break;
                }
            case 4:
                {
                    char exp[20];
                    int valid;
                    printf("Enter an algebraic expression : \n");
                    scanf("%s", exp);
                    valid = check(exp);
                    if (valid == 1)
                    {
                        printf("Valid expression\n");
                    }
                    else
                    {
                        printf("Invalid expression\n");
                    }
                    break;
                }
            case 5:
                {
                    int dec;
                    printf("enter decimal number\n");
                    scanf("%d", &dec);
                    dectobin(dec);
                    break;
                }
            case 6:
                {
                    intopost();
                    break;
                }
            case 7:
                {
                    exit(0);
                }
            default:
                printf("invalid choice\n");
        }
    } while (ch != 7);
}
 
     
    