convert infix to postfix

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • caramel

    convert infix to postfix

    i've been working on this program forever! now i'm stuck and going
    insane because i keep getting a syntax error msg and i just can't see
    what the compiler is signaling to!

    Code:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>
    
    /* constants */
    #define TRUE 1
    #define FALSE 0
    
    /* structure for stack */
    typedef struct
    {
    char data[40];  /* array to hold stack contents */
    int tos;        /* top of the stack pointer */
    }
    STACK;
    
    /* function prototypes */
    void initStack(STACK *stack);
    void get_infix(char infix[]);
    void convertToPostfix(char infix[], char postfix[]);
    int isOperator(char c);
    int precedence(char operator1, char operator2);
    int pred_level(char ch);
    void push(STACK *stack, char value);
    char pop(STACK *stack);
    char stackTop(STACK *stack);
    int isEmpty(STACK *stack);
    int isFull(STACK *stack);
    void printResult(char infix[], char postfix[]);
    void print_msg(void);
    
    /* program entry point */
    int main()
    {
    char infix[40], postfix[40]="";
    
    /* convert from infix to postfix main function */
    convertToPostfix(infix, postfix);
    /* display the postfix equivalent */
    infix[strlen(infix)-2] = '\0';
    printResult(infix, postfix);
    
    return EXIT_SUCCESS;
    }
    
    /* initalise the stack */
    void initStack(STACK *stack)
    {
    stack->tos = -1;  /* stack is initially empty */
    }
    
    /* get infix expression from user */
    void get_infix(char infix[])
    {
    int i;
    
    printf("Enter infix expression: ");
    fflush(stdin);
    
    for ( i=0; i<40; )
    {
    if ( (infix[i] = getchar()) == '\n' )
    {
    i++;
    break;
    }
    else if ( !(isspace(infix[i])) )
    i++;
    }
    
    infix[i] = '\0';
    }
    
    /* convert the infix expression to postfix notation */
    void convertToPostfix(char infix[], char postfix[])
    {
    int i, length;
    int j=0;
    char tos_ch;
    STACK stack;
    
    initStack(&stack); /* initialise stack */
    get_infix(infix);  /* get infix expression from user */
    length = strlen(infix);
    
    if ( length )
    {
    push(&stack, '(');
    strcat(infix, ")");
    length++;
    
    for ( i=0; i<length; i++ )
    {
    /* if current operator in infix is digit */
    if ( isdigit(infix[i]) )
    {
    postfix[j++] = infix[i];
    }
    /* if current operator in infix is left parenthesis */
    else if ( infix[i] == '(' )
    {
    push(&stack, '(');
    }
    /* if current operator in infix is operator */
    else if ( isOperator(infix[i]) )
    {
    while ( TRUE )
    {
    /* get tos */
    tos_ch = stackTop(&stack);
    
    /* no stack left */
    if ( tos_ch == '\0' )
    {
    printf("\nFull Stack!\n");
    print_msg();
    exit(1);
    }
    else
    {
    if ( isOperator(tos_ch) )
    {
    if ( pred_level(tos_ch) >=
    pred_level(infix[i]) )
    postfix[j++] = pop(&stack);
    else
    break;
    }
    else
    break;
    }
    }
    push(&stack, infix[i]);
    }
    /* if current operator in infix is right parenthesis */
    else if ( infix[i] == ')' )
    {
    while ( TRUE )
    {
    /* get tos */
    tos_ch = stackTop(&stack);
    
    /* no stack left */
    if ( tos_ch == '\0' )
    {
    printf("\nFull Stack!\n");
    print_msg();
    exit(1);
    }
    else
    {
    if ( tos_ch != '(' )
    {
    postfix[j++] = tos_ch;
    pop(&stack);
    }
    else
    {
    pop(&stack);
    break;
    }
    }
    }
    continue;
    }
    }
    }
    
    postfix[j] = '\0';
    }
    
    /* determine if c is an operator */
    switch (c) {
    case '+':
    return TRUE;
    break;
    case '-':
    return TRUE;
    break;
    case '*':
    return TRUE;
    break;
    case '/':
    return TRUE;
    break;
    default:
    return FALSE;
    break;
    /*if ( c == '+' || c == '-' || c == '*' ||
    c == '/' || c == '%' || c == '^' )
    {
    return TRUE;
    }
    else
    return FALSE; */
    }
    
    /* determine precedence level */
    int pred_level(char ch)
    {
    if ( ch == '+' || ch == '-' )
    return 1;
    else
    return 2;
    }
    
    /* determine if the precedence of operator1 is less than,
    equal to, greater than the precedence of operator2 */
    int precedence(char operator1, char operator2)
    {
    if ( pred_level(operator1) > pred_level(operator2) )
    return 1;
    else if ( pred_level(operator1) < pred_level(operator2) )
    return -1;
    else
    return 0;
    }
    
    /* push a value on the stack */
    void push(STACK *stack, char value)
    {
    if ( !(isFull(stack)) )
    {
    (stack->tos)++;
    stack->data[stack->tos] = value;
    }
    }
    
    /* pop a value off the stack */
    char pop(STACK *stack)
    {
    char ch;
    
    if ( !(isEmpty(stack)) )
    {
    ch = stack->data[stack->tos];
    (stack->tos)--;
    return ch;
    }
    else
    return '\0';
    }
    
    /* return the top value of the stack without popping the stack */
    char stackTop(STACK *stack)
    {
    if ( !(isEmpty(stack)) )
    return stack->data[stack->tos];
    else
    return '\0';
    }
    
    /* determine if stack is empty */
    int isEmpty(STACK *stack)
    {
    /* empty */
    if ( stack->tos == -1 )
    return TRUE;
    /* not empty */
    else
    return FALSE;
    }
    
    /* determine if stack is full */
    int isFull(STACK *stack)
    {
    /* full */
    if ( stack->tos == 19 )
    return TRUE;
    /* not full */
    else
    return FALSE;
    }
    
    /* display the result postfix expression */
    void printResult(char infix[], char postfix[])
    {
    /*system("cls");*/
    printf("\n\n");
    printf("Infix notation: %d%s\n", infix);
    printf("Postfix notation: %d%s\n\n", postfix);
    print_msg();
    }
    
    /* print exit message */
    void print_msg(void)
    {
    printf("Hit <RETURN> to exit...");
    fflush(stdin);
    getchar();
    }
    the error msg i get is: syntax error before "switch"

    i don't get it :S ... any suggestions?

  • caramel

    #2
    Re: convert infix to postfix

    ok i finally fixed the error!!! but the program outputs operators and
    numbers, no variables

    for example: if i input a*b+c*d/2 , it gives **2/+

    so what now?

    Comment

    • pete

      #3
      Re: convert infix to postfix

      caramel wrote:
      [color=blue]
      > the error msg i get is: syntax error before "switch"
      >
      > i don't get it :S ... any suggestions?[/color]

      Which function is the switch statement supposed to be in?

      --
      pete

      Comment

      • bitshadow

        #4
        Re: convert infix to postfix


        pete wrote:[color=blue]
        > caramel wrote:
        >[color=green]
        > > the error msg i get is: syntax error before "switch"
        > >
        > > i don't get it :S ... any suggestions?[/color]
        >
        > Which function is the switch statement supposed to be in?
        >
        > --[/color]
        the switch is in void convertToPostfi x(char infix[], char postfix[])
        what i want to know is where is 'c'. i've attempted to trace the
        program state and can't find out where it is. You don't seem to pass it
        as an argument. Also flushing stdin causes undefined behaviour, take
        that out.

        Comment

        • pete

          #5
          Re: convert infix to postfix

          bitshadow wrote:[color=blue]
          >
          > pete wrote:[color=green]
          > > caramel wrote:
          > >[color=darkred]
          > > > the error msg i get is: syntax error before "switch"
          > > >
          > > > i don't get it :S ... any suggestions?[/color]
          > >
          > > Which function is the switch statement supposed to be in?
          > >
          > > --[/color]
          > the switch is in void convertToPostfi x(char infix[], char postfix[])
          > what i want to know is where is 'c'.[/color]

          Maybe that's where it's supposed to be,
          which is what I asked, but that's not where it is.

          I'd like to see an example of the output is supposed to be
          for a given input.

          --
          pete

          Comment

          • pete

            #6
            Re: convert infix to postfix

            pete wrote:[color=blue]
            >
            > bitshadow wrote:[color=green]
            > >
            > > pete wrote:[color=darkred]
            > > > caramel wrote:
            > > >
            > > > > the error msg i get is: syntax error before "switch"
            > > > >
            > > > > i don't get it :S ... any suggestions?
            > > >
            > > > Which function is the switch statement supposed to be in?
            > > >
            > > > --[/color]
            > > the switch is in void convertToPostfi x(char infix[], char postfix[])
            > > what i want to know is where is 'c'.[/color]
            >
            > Maybe that's where it's supposed to be,
            > which is what I asked, but that's not where it is.[/color]

            I think the switch is supposed to be in isOperator().
            Where isOperator is, I don't know.

            --
            pete

            Comment

            • caramel

              #7
              Re: convert infix to postfix

              well i fixed the switch, now i need to get it to print variables

              it works as intended with numbers and operators, but for some reason it
              does not print the variables entered to the console

              Comment

              • pete

                #8
                Re: convert infix to postfix

                caramel wrote:[color=blue]
                >
                > well i fixed the switch, now i need to get it to print variables
                >
                > it works as intended with numbers and operators,
                > but for some reason it
                > does not print the variables entered to the console[/color]

                Probably has something to do with the current state of your code.

                --
                pete

                Comment

                • caramel

                  #9
                  Re: convert infix to postfix

                  true, i was wondering if anyone can point out any mistake(s) or suggest
                  a fragment of code i can insert to display variables

                  Comment

                  • Barry Schwarz

                    #10
                    Re: convert infix to postfix

                    On 18 Nov 2005 15:42:10 -0800, "caramel" <esraahalim@gma il.com> wrote:
                    [color=blue]
                    >i've been working on this program forever! now i'm stuck and going
                    >insane because i keep getting a syntax error msg and i just can't see
                    >what the compiler is signaling to!
                    >[/color]
                    snip[color=blue]
                    >/* convert the infix expression to postfix notation */
                    >void convertToPostfi x(char infix[], char postfix[])[/color]

                    You did an excellent job of lining up all your braces.
                    [color=blue]
                    >{[/color]
                    snip[color=blue]
                    > if ( length )
                    > {[/color]
                    snip[color=blue]
                    > for ( i=0; i<length; i++ )
                    > {[/color]
                    snip[color=blue]
                    > if ( isdigit(infix[i]) )
                    > {[/color]
                    snip[color=blue]
                    > }[/color]
                    snip[color=blue]
                    > else if ( infix[i] == '(' )
                    > {[/color]
                    snip[color=blue]
                    > }[/color]
                    snip[color=blue]
                    > else if ( isOperator(infi x[i]) )
                    > {
                    > while ( TRUE )
                    > {[/color]
                    snip[color=blue]
                    > if ( tos_ch == '\0' )
                    > {[/color]
                    snip[color=blue]
                    > }
                    > else
                    > {
                    > if ( isOperator(tos_ ch) )
                    > {
                    > if ( pred_level(tos_ ch) >= pred_level(infi x[i]) )[/color]
                    snip[color=blue]
                    > else[/color]
                    snip[color=blue]
                    > }
                    > else[/color]
                    snip[color=blue]
                    > }
                    > }[/color]
                    snip[color=blue]
                    > }[/color]
                    snip[color=blue]
                    > else if ( infix[i] == ')' )
                    > {
                    > while ( TRUE )
                    > {[/color]
                    snip[color=blue]
                    > if ( tos_ch == '\0' )
                    > {[/color]
                    snip[color=blue]
                    > }
                    > else
                    > {
                    > if ( tos_ch != '(' )
                    > {[/color]
                    snip[color=blue]
                    > }
                    > else
                    > {[/color]
                    snip[color=blue]
                    > }
                    > }
                    > }[/color]
                    snip[color=blue]
                    > }
                    > }
                    > }[/color]
                    snip[color=blue]
                    >}[/color]

                    This brace ends the function.
                    [color=blue]
                    >
                    >/* determine if c is an operator */
                    >switch (c) {[/color]

                    You cannot put a switch statement (or most other statements) outside
                    of a function.

                    snip


                    <<Remove the del for email>>

                    Comment

                    • caramel

                      #11
                      Re: convert infix to postfix

                      the brace after (c) ?

                      and thanks for the compliment, i am a neat freak ;)


                      but u guys the program works fine now, and i get no more error msgs,
                      just that one problem that it drops out the variables and only displays
                      numbers and operators... how do i fix that?

                      Comment

                      • slebetman@yahoo.com

                        #12
                        Re: convert infix to postfix

                        caramel wrote:[color=blue]
                        > the brace after (c) ?
                        >
                        > and thanks for the compliment, i am a neat freak ;)
                        >
                        >
                        > but u guys the program works fine now, and i get no more error msgs,
                        > just that one problem that it drops out the variables and only displays
                        > numbers and operators... how do i fix that?[/color]

                        In your for loop in convertToPostfi x, you checked for:

                        1. isdigit
                        2. the opening bracket '('
                        3. isOperator
                        4. the closing bracket ')'

                        but ignored everything else. That's why you keep droping variables. I
                        suggest that after the last else if put an else to accept everything
                        else as variables. If you want to restrict variables to alphabets then
                        check for isAnAcceptableV ariable.

                        Comment

                        • caramel

                          #13
                          Re: convert infix to postfix

                          thanks for the input, i'll go through with that and see what happens

                          many thanks and much appreciation to all who shared their thoughts :)

                          Comment

                          • Keith Thompson

                            #14
                            Re: convert infix to postfix

                            "caramel" <esraahalim@gma il.com> writes:[color=blue]
                            > the brace after (c) ?
                            >
                            > and thanks for the compliment, i am a neat freak ;)
                            >
                            >
                            > but u guys the program works fine now, and i get no more error msgs,
                            > just that one problem that it drops out the variables and only displays
                            > numbers and operators... how do i fix that?[/color]

                            Some suggestions on posting style:

                            Don't assume your readers can see the article to which you're
                            replying. You need to provide some context. Google makes it
                            unecessarily difficult to do this, but there is a workaround (which
                            has been posted here over 1000 times):

                            If you want to post a followup via groups.google.c om, don't use
                            the broken "Reply" link at the bottom of the article. Click on
                            "show options" at the top of the article, then click on the
                            "Reply" at the bottom of the article headers.

                            Also, please don't use abbreviations like "u" for "you". They just
                            make your text more difficult to read. Proper capitalization is also
                            helpful.

                            --
                            Keith Thompson (The_Other_Keit h) kst-u@mib.org <http://www.ghoti.net/~kst>
                            San Diego Supercomputer Center <*> <http://users.sdsc.edu/~kst>
                            We must do something. This is something. Therefore, we must do this.

                            Comment

                            • Kenny McCormack

                              #15
                              Re: convert infix to postfix

                              In article <lnoe4h886j.fsf @nuthaus.mib.or g>,
                              Keith Thompson <kst-u@mib.org> wrote:
                              ....[color=blue]
                              >Don't assume your readers can see the article to which you're
                              >replying. You need to provide some context. Google makes it
                              >unecessarily difficult to do this, but there is a workaround (which
                              >has been posted here over 1000 times):
                              >
                              > If you want to post a followup via groups.google.c om, don't use
                              > the broken "Reply" link at the bottom of the article. Click on
                              > "show options" at the top of the article, then click on the
                              > "Reply" at the bottom of the article headers.[/color]

                              You are wasting your breath. They'll never get it. And I'll tell you why.

                              Imagine that there's a mouse - and the mouse is the Usenet. You and I can
                              see that it is a mouse and we behave accordingly. But now there is a class
                              of users (we'll call them "googlers") that are wearing these funny weird
                              glasses that make them see not a mouse, but an elephant. Seeing an
                              elephant (i.e., the Usenet as a web page), they also behave accordingly.
                              And no amount of verbiage from us is going to convince them that it's not
                              an elephant - that it is only a mouse.

                              To make this more clear, to a googler, it doesn't make any sense to "quote"
                              (whatever the heck that is...), in fact, to do so would be absurd, when all
                              the rest of the articles in the thread are right there in front of their
                              faces (just as clear as the trunk on that mouse, er, elephant). And no
                              amount of verbiage from us is going to convince them not to believe what
                              they see. The point is you can *never* convince someone that what they see
                              isn't reality. The only way you can address the problem is to help them
                              fix their eyesight (or help them remove their funny glasses).
                              [color=blue]
                              >Also, please don't use abbreviations like "u" for "you". They just
                              >make your text more difficult to read. Proper capitalization is also
                              >helpful.[/color]

                              Good advice. tnk u.

                              Comment

                              Working...