home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The C Users' Group Library 1994 August
/
wc-cdrom-cusersgrouplibrary-1994-08.iso
/
listings
/
v_10_03
/
1003021a
< prev
next >
Wrap
Text File
|
1991-12-19
|
2KB
|
104 lines
#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';
}