Listing 2

#include <ctype.h>

void push(int);
int pop(void);

/*------------------------------------------------------------------

FUNCTION: intopost - converts infix to postfix

A.  Push a ( on the stack. This sentinel allows us to detect when we have
flushed out the stack on completion in step I.

--- Perform steps B through H for each character in the infix string ---

B.  Ignore white space.

C.  Pass alphabetic characters through to postfix list.

D.  Push any ( on the stack. These sentinels allows us to detect when we
have flushed out the stack when handling ) and operators.

E.  Have a ) so pop off the stack and put into postfix list until a ( is
popped. Discard that (.

F.  Have a * or /.  Pop off any operators of equal or higher precedence
and put them into postfix list. If a ( or lower precedence operator (such
as + or -) is popped, put it back and stop looking. Push new * or /.

G.  Have a + or -.  Pop off any operators of equal or higher precedence
(that includes all of them) and put them into postfix list. If a ( is
popped, put it back and stop looking. Push new + or -.

H.  Report unknown character on input.

------

I.  Have processed all input characters. Now flush stack until we find
the matching ( put there in step A.

J.  Terminate the postfix list.

--------------------------------------------------------------------*/

void intopost(const char *infix, char *postfix)
{
       int st;

/*A*/   push (' (');
       while (*infix != '\0') {

#ifdef TRACE
printf("*infix: %c\n", *infix);
#endif

/*B*/           if (isspace(*infix)) {
                    ;
              }
/*C*/           else if (isalpha(*infix)) {
                    * postfix++ = *infix;
              }
/*D*/           else if (*infix == '(') {
                    push('(');
              }
/*E*/           else if (*infix == ')') {
                    while ((st = pop()) != '(')
                           * postfix++ = st;
              }
/*F*/           else if (*infix == '*' || *infix == '/') {
                    while (1) {
                           if ((st = pop()) == '(' || st == '+'
                              || st == '-') {
                                  push(st);
                                  break;
                           }
                           *postfix++ = st;
                    }
                    push(*infix);
              }
/*G*/           else if (*infix == '+' || *infix == '-') {
                    while (1) {
                           if ((st = pop()) == '(') {
                                  push(st);
                                  break;
                           }
                           *postfix++ = st;
                    }
                    push(*infix);
              }
/*H*/           else {
                    printf("Unknown input character %c\n", *infix);
              }

              ++infix;
              continue;
       }

/*I*/   while ((st = pop()) != '(')
              *postfix++ = st;

/*J*/   *postfix = '\0';

/* End of File */