2016-02-01 7 views
1

Я искал сайт, чтобы узнать, есть ли какие-либо подобные вопросы для моего, но я не могу найти тот, который предлагает рабочее решение. Ниже приведен код полнофункционального infix для постфикса конвертер для арифметического синтаксиса.Интервал между операндами программы Infix-Postfix в C

Проблема заключается в том, что если пользователь вводит строку, такую ​​как 23+89, выход infix составляет 2389+. Это, конечно, правильно, однако я хочу добавить разделители между операндами, чтобы различать 23 и 89. Как это можно реализовать с массивом, который я использую? Нужно ли добавлять символ пробела между операндами в массиве? Как это можно достичь?

Любое понимание будет принята с благодарностью.

#include <stdio.h> 
#include <stdbool.h> 
#include <ctype.h> 
#include <string.h> 
#define MAX 100 // maximum number of input characters 

int precedence(char x); 

struct stack 
{ 
    char my_stack[MAX]; 
    int pointer; 
}; 

int precedence(char x) 
{ 
    if(x == '(') 
     return(0); 
    if(x == '+' || x == '-') 
     return(1); 
    if(x == '*' || x == '/') 
     return(2); 
    return(3); 
} 

int main(void) 
{ 
    struct stack S; 
    S.pointer = 0; 
    char c; 
    char output[MAX]; // stores output 
    int out_count = 0; // stores no. of characters of output 
    char data; // stores data being popped off the stack 

    printf("Enter an expression to check:\n"); 
    fflush(stdout); 
    while(('\n' != (c=getchar()))) 
    { 
     if(isdigit(c)) // if an operand is found print to screen 
     { 
      output[out_count] = c; 
      out_count++; 
     } 
     else if(c == '(') // if (is found push on stack 
     { 
      S.pointer = S.pointer +1; 
      S.my_stack[S.pointer] = c; 
     } 
     else if(c == ')') // if) is found pop stack until (is found 
     { 
      while(!(S.my_stack[S.pointer] == '(')) 
      { 
       data = S.my_stack[S.pointer]; 
       output[out_count] = data; 
       out_count++; 
       S.pointer = S.pointer -1; 
      } 
      S.pointer = S.pointer -1; // pop the extra (
     } 
     else if(c == '*' || c == '/' || c == '+' || c == '-') 
     { 
      if((S.pointer) == 0) 
      { 
       S.pointer = S.pointer +1; 
       S.my_stack[S.pointer] = c; 
      } 
      else 
      { 
       if(precedence(S.my_stack[S.pointer]) > precedence(c)) 
       { 
        // pop stack 
        int i; 
        for(i=(S.pointer); i >= 0; i--) 
        { 
         if(c == '(' || c == ')') 
          continue; 
         output[out_count] = c; 
         out_count++; 
        } 
        S.pointer = 0; 
       } 
       else 
       { 
        // push c on stack 
        S.pointer = S.pointer +1; 
        S.my_stack[S.pointer] = c; 
       } 
      } 

     } 
    } 

    int j = S.pointer; 
    while(j != 0) 
    { 
     if(S.my_stack[j] == '(') 
      continue; 
     output[out_count] = S.my_stack[j]; 
     out_count++; 
     j--; 
    } 

    output[out_count+1] = '\0'; 
    int k=0; 
    while(output[k] != '\0') // go through output array and print 
    { 
     printf("%c", output[k]); 
     k++; 
    } 

    return 0; 
} 
+0

Любопытно: почему '()' иногда вокруг возвращаемых значений, таких как 'return (3);'? – chux

ответ

0

23 + 89, выход инфиксным является 2389+. Это, конечно, правильно,

Ну, нет. 2389 - это не то же самое, что и 23 и 89.

Вы можете либо добавить пробел, либо явный оператор «push». Калькуляторы HP часто используют символ стрелки вверх, чтобы показать эту операцию.

+0

Правильно в том смысле, что логика кода верна. Как я могу реализовать этот явный «push-оператор»? Я не уверен, что следую тому, что вы имеете в виду. –

+0

@LukeCollins: выдает '23 + 89 конвертирует в 23 ↑ 89 +' (если не ограничивается Ascii) или '23 + 89 конвертирует в 23 push 89 +' (если вы есть). – wallyk