Pregunta

He estado tratando de averiguar este problema. Tengo una misión para hacer una calculadora básica.

Para hacer eso es necesario las instrucciones de sufijo. He encontrado algo de código en línea, que funcionó, pero se utiliza ().

Me trató de reemplazar la obtiene ... pero el programa ya no funciona. Aquí está el código, yo estaba esperando que alguien podría encontrar el error (usando 2 + 4 como entrada, lee y reconoce como 2 dígitos, a continuación, + como operador, a continuación, como un dígito 4 ... entonces se queda atascado en una alguna parte de bucle a lo largo de la línea)

Para ser claros, el uso de este código es presa fácil para mi asignación, siempre que cito es como una referencia (ya que es sólo una pequeña parte).

#include <stdio.h>
#include <string.h>
#include <ctype.h>

#define MAX 10
#define EMPTY -1

struct stack
{
    char data[MAX];
    int top;
};

int isempty(struct stack *s)
{
    printf("isempty\n");
    return (s->top == EMPTY) ? 1 : 0;
}

void emptystack(struct stack* s)
{
    printf("emptystack\n");
    s->top=EMPTY;
}

void push(struct stack* s,int item)
{
    printf("push\n");
    if(s->top == (MAX-1))
    {
        printf("\nSTACK FULL");
    }
    else
    {
        printf("add to stack\n");
        ++s->top;
        s->data[s->top]=item;
    }
}

char pop(struct stack* s)
{
    printf("pop\n");
    char ret=(char)EMPTY;
    if(!isempty(s))
    {
        ret= s->data[s->top];
        --s->top;
    }
    return ret;
}

void display(struct stack s)
{
    printf("display\n");
    while(s.top != EMPTY)
    {
        printf("not empty\n");
        printf("\n%d",s.data[s.top]);
        s.top--;
    }
}

int isoperator(char e)
{
    getchar();
    printf("isoperator\n");
    if(e == '+' || e == '-' || e == '*' || e == '/' || e == '%')
        return 1;
    else
        return 0;
}


int priority(char e)
{
    printf("priority\n");
    int pri = 0;

    if(e == '*' || e == '/' || e =='%')
        pri = 2;
    else
    {
        if(e == '+' || e == '-')
            pri = 1;
    }
    return pri;
}

void infix2postfix(char* infix, char * postfix, int insertspace)
{
    printf("in infix2postfix\n");
    char *i,*p;
    struct stack X;
    char n1;
    emptystack(&X);
    i = &infix[0];
    p = &postfix[0];

    while(*i)
    {
        while(*i == ' ' || *i == '\t')
        {
            i++;
        }

        if( isdigit(*i) || isalpha(*i) )
        {
            printf("is digit.\n");
            while( isdigit(*i) || isalpha(*i))
            {
                *p = *i;
                p++;
                i++;
            }
            /*SPACE CODE*/
            if(insertspace)
            {
                *p = ' ';
                p++;
            }
            /*END SPACE CODE*/
        }

        if( *i == '(' )
        {
            push(&X,*i);
            i++;
        }

        if( *i == ')')
        {
            n1 = pop(&X);
            while( n1 != '(' )
            {
                *p = n1;
                p++;
                /*SPACE CODE*/
                if(insertspace)
                {
                    *p = ' ';
                    p++;
                }
                /*END SPACE CODE*/
                n1 = pop(&X);
            }
            i++;
        }

        if( isoperator(*i) )
        {
            if(isempty(&X))
                push(&X,*i);
            else
            {
                n1 = pop(&X);
                while(priority(n1) >= priority(*i))
                {
                    *p = n1;
                    p++;
                    /*SPACE CODE*/
                    if(insertspace)
                    {
                        *p = ' ';
                        p++;
                    }
                    /*END SPACE CODE*/
                    n1 = pop(&X);
                }
                push(&X,n1);
                push(&X,*i);
            }
            i++;
        }
    }
    while(!isempty(&X))
    {
        n1 = pop(&X);
        *p = n1;
        p++;
        /*SPACE CODE*/
        if(insertspace)
        {
            *p = ' ';
            p++;
        }
        /*END SPACE CODE*/
    }
    *p = '\0';
}

int main()
{
    char in[50],post[50],temp[50];

    strcpy(&post[0],"");
    printf("Enter Infix Expression : ");
    fflush(stdin);
    fgets(in,50,stdin);
    printf("%s",in);
    infix2postfix(&in[0],&post[0],1);
    printf("Postfix Expression is : %s\n",&post[0]);

    return 0;
}

Gracias por la ayuda, se lo agradezco mucho :).

¿Fue útil?

Solución

fgets() incluye una nueva línea en la cadena cuando se pone a uno, por lo que tiene una lectura cadena "2 + 4 \ n". Vuelva a colocar la while (*i) con while (*i && *i != '\n') y ver a dónde te lleva.

Otros consejos

#include<stdio.h>
char stack[100];
int lowerBound=0;
int upperBound=99;
int top=upperBound+1;
int size=0;  
char postFix[101];
int postFixLowerBound=0;
void push(char op)
{
  top--;
  stack[top]=op;
  size++;
}
char pop()
{
 char op;
 op=stack[top];
 top++;
 size--;
 return op;
 }
 int isEmpty()
{
  return top==upperBound+1;
}
 int isOperator(char c)
 {
   return(c=='^'||c=='/'||c=='*'||c=='+'||c=='-');
  }
 int isOperand()
 {
    if(isOperator(c)) return 0;
   else return 1;
 }
 int getPrecedenceLevel(char op)
 {
    if(op=='^') return 3;
    if(op=='/' || op=='*') return 2;
    if(op=='+' || op=='-') return 1;
    return 0;
 }
 int getElementAtTop()
 {
   return stack[top];
 }
 void appendToPostFixString(char c)
 {
  postFix[postFixLowerBound]=c;
  postFixLowerBound++;
  postFix[postFixLowerBound]='\0';
 }
  void main()
  {
   char infix[101];
   char c,op;
   int i;
   printf("Enter an infix expression\n");
   scanf("%s",infix);
   i=0;
   while(infix[i]='\0')
   {
    c=infix[i];
    i++;
    if(c=='(')
    {
      push(c);
      continue;
     }
      if(c==')')
     {
       while(1)
      {
       op=pop();
      if(op=='(')
      {
      op=pop();
      if(op=='(')
      {
        break;
      } 
      appendToPostFixString(op);
    }
    continue;
  }
  if(isOperand(c))
  {
    appendToPostFixString(c);
    continue;
  }
  if(isOperator(c))
  {
   if(isEmpty())
   {
     push(c);
   }
   else
   {
     op=getElementAtTop();
     if(op=='(')
     {
       push(c);
     }
     else
     {
       if(getPrecedenceLevel(op)>=getPrecedenceLevel(c))
       {
         while(1)
         {
           if(isEmpty())
           {
             break;
           } 
           op=getElementAtTop();
           if(op=='(')
           {
             break;
           }
           if(getPrecedenceLevel(op)<getPrecedenceLevel(c))
           {
             break;
           }
           op=pop();
           appendToPostFixString(op);
         }
         push(c);
       }
       else
       {
         push(c);
       }
     }
   }
   continue;
  }//while ends
  while(1)
  {
    if(isEmpty())
    {
      break;
    }
 op=pop();
 appendToPostFixString(op);
 }
 printf("Post Fix Expression is \n");
 printf("%s",postFix);
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top