Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C Programming > convert infix to postfix

Reply
Thread Tools

convert infix to postfix

 
 
caramel
Guest
Posts: n/a
 
      11-18-2005
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?

 
Reply With Quote
 
 
 
 
caramel
Guest
Posts: n/a
 
      11-19-2005
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?

 
Reply With Quote
 
 
 
 
pete
Guest
Posts: n/a
 
      11-19-2005
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?

--
pete
 
Reply With Quote
 
bitshadow
Guest
Posts: n/a
 
      11-19-2005

pete wrote:
> 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?
>
> --

the switch is in void convertToPostfix(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.

 
Reply With Quote
 
pete
Guest
Posts: n/a
 
      11-19-2005
bitshadow wrote:
>
> pete wrote:
> > 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?
> >
> > --

> the switch is in void convertToPostfix(char infix[], char postfix[])
> what i want to know is where is 'c'.


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
 
Reply With Quote
 
pete
Guest
Posts: n/a
 
      11-19-2005
pete wrote:
>
> bitshadow wrote:
> >
> > pete wrote:
> > > 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?
> > >
> > > --

> > the switch is in void convertToPostfix(char infix[], char postfix[])
> > what i want to know is where is 'c'.

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


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

--
pete
 
Reply With Quote
 
caramel
Guest
Posts: n/a
 
      11-19-2005
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

 
Reply With Quote
 
pete
Guest
Posts: n/a
 
      11-19-2005
caramel wrote:
>
> 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


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

--
pete
 
Reply With Quote
 
caramel
Guest
Posts: n/a
 
      11-19-2005
true, i was wondering if anyone can point out any mistake(s) or suggest
a fragment of code i can insert to display variables

 
Reply With Quote
 
Barry Schwarz
Guest
Posts: n/a
 
      11-19-2005
On 18 Nov 2005 15:42:10 -0800, "caramel" <(E-Mail Removed)> wrote:

>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!
>

snip
>/* convert the infix expression to postfix notation */
>void convertToPostfix(char infix[], char postfix[])


You did an excellent job of lining up all your braces.

>{

snip
> if ( length )
> {

snip
> for ( i=0; i<length; i++ )
> {

snip
> if ( isdigit(infix[i]) )
> {

snip
> }

snip
> else if ( infix[i] == '(' )
> {

snip
> }

snip
> else if ( isOperator(infix[i]) )
> {
> while ( TRUE )
> {

snip
> if ( tos_ch == '\0' )
> {

snip
> }
> else
> {
> if ( isOperator(tos_ch) )
> {
> if ( pred_level(tos_ch) >= pred_level(infix[i]) )

snip
> else

snip
> }
> else

snip
> }
> }

snip
> }

snip
> else if ( infix[i] == ')' )
> {
> while ( TRUE )
> {

snip
> if ( tos_ch == '\0' )
> {

snip
> }
> else
> {
> if ( tos_ch != '(' )
> {

snip
> }
> else
> {

snip
> }
> }
> }

snip
> }
> }
> }

snip
>}


This brace ends the function.

>
>/* determine if c is an operator */
>switch (c) {


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

snip


<<Remove the del for email>>
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
How to convert Infix notation to postfix notation Tameem C Programming 454 01-31-2014 06:01 PM
The Concepts and Confusions of Prefix, Infix, Postfix and Fully Functional Notations Xah Lee Java 30 06-16-2007 05:57 PM
The Concepts and Confusions of Prefix, Infix, Postfix and Fully Functional Notations Xah Lee Python 30 06-16-2007 05:57 PM
Infix to postfix when have no brackets in the input? tomerdr@gmail.com C++ 1 12-28-2006 10:03 PM
infix to postfix expression string for evalution. KidLogik C++ 5 02-03-2004 05:20 PM



Advertisments