преобразование инфикса в постфикс с использованием стека

я написал код для преобразования инфиксной нотации в постфиксную. он отлично работает без скобок, но дает мне ошибку времени выполнения, когда я заключаю выражение в скобки. я должен использовать аргументы командной строки.

#include<stdio.h>
int top = -1;
push(char *s, char elem) {
  ++top;
  s[top] = elem;
}

char pop(char *s) { 
 char elem;
  elem = s[top];
  top--;
  return (elem);
 }

int Sempty() { 
 if (top == -1)
  return 1;
 return 0;
}

int pri(char elem){
switch(elem){
case '/':
case '*':   return 2;
case '+':
case '-':   return 1;
}   }

main(int argc, char *argv[]){
int i, x, y;
char elem, new;
char a[50];
printf("\t\t------infix notation-----\n");
for(i = 1; i<argc; i++) printf("%s ", argv[i]);
printf("\n\t\t------postfix notation-----\n");
for(i = 1; i<argc; i++){
if(argv[i][0] == '(')   push(a, argv[i][0]);
else if(isalnum(argv[i][0]))    printf("%s ", argv[i]);
else if(argv[i][0] == ')'){ elem = pop(a);
    while(elem != '('){
        printf("%c ", elem);
        elem = pop(a);  }
    if(elem == '(') top--;
        }
else{
x = pri(argv[i][0]);
    if(Sempty())    push(a, argv[i][0]);
    else{
    elem = pop(a);
    y = pri(elem);
        if(y>=x){
            printf("%c ", elem);
            push(a, argv[i][0]);    }
        else{ 
            push(a, elem);  
            push(a, argv[i][0]);}
        }   }
}
while(!Sempty()){
elem = pop(a);
printf("%c ", elem);    }
printf("\n");
}

ввод

./a.out 2 + 3

вывод

------infix notation-----
2 + 3 

------postfix notation-----

2 3 + 

но если я дам

ввод

./a.out ( 2 + 3 )

вывод

bash: syntax error near unexpected token `2'

person user3248186    schedule 20.03.2014    source источник
comment
Похоже, эта ошибка исходит от bash, а не от вашего кода. Я не эксперт, но я предполагаю, что bash читает ( как какой-то специальный символ в командной строке.   -  person Chowlett    schedule 20.03.2014
comment
Отформатируйте свой код, это больно читать.   -  person Jabberwocky    schedule 20.03.2014


Ответы (1)


Скобки имеют особое значение для оболочки, вы должны заключать их в кавычки или экранировать:

./a.out '(' 2 + 3 ')'
person Barmar    schedule 20.03.2014