Я пытался отладить эту программу в течение длительного времени. Он отлично работает, когда я вводим выражения как a + b-c или a/b + c, где первый оператор имеет больший или равный приоритет, чем второй. Но для выражений типа a-b/c, где первый оператор имеет меньший приоритет, чем второй, компилятор выдает точку останова.Infix для постфиксной реализации с использованием связанных списков в C
struct stack
{
char ele;
struct stack *next;
};
void push(int);
int pop();
int precedence(char);
struct stack *top = NULL;
int main()
{
char infix[20], postfix[20];
int i=0,j=0;
printf("ENTER INFIX EXPRESSION: ");
gets(infix);
while(infix[i]!='\0')
{
if(isalnum(infix[i]))
postfix[j++]=infix[i];
else
{
if(top==NULL)
push(infix[i]);
else
{
while(top!=NULL && (precedence(top->ele)>=precedence(infix[i])))
postfix[j++]=pop();
push(infix[i]);
}
}
++i;
}
while(top!=NULL)
postfix[j++]=pop();
postfix[j]='\0';
puts(postfix);
getchar();
return 0;
}
int precedence(char x)
{
switch(x)
{
case '^': return 4;
case '*':
case '/': return 3;
case '+':
case '-': return 2;
default: return 0;
}
}
void push(int x)
{
int item;
struct stack *tmp;
if(top==NULL)
{
top=(struct stack *)malloc(sizeof(struct stack));
top->ele=x;
top->next=NULL;
}
else
{
tmp=top;
top->ele=x;
top->next=tmp;
}
}
int pop()
{
struct stack *tmp;
int item;
if(top==NULL)
puts("EMPTY STACK");
else if(top->next==NULL)
{
tmp=top;
item=top->ele;
top=NULL;
free(tmp);
}
else
{
tmp=top;
item=top->ele;
top=top->next;
free(tmp);
}
return item;
}
Любые советы по улучшению моего кодирования были бы полезными. Спасибо за помощь, я действительно ценю это :)
Когда я вижу код и задачи, как это, я всегда благодарю Бога за то, Поддавшись умных компьютерных ученых идею рекурсивного спуска анализаторами ... – 2013-03-02 11:08:27
Для разборе , думаю, «деревья». Например, выражение «1 + 2» можно рассматривать как дерево с «+» в качестве корневого узла, а «1» и «2» - дочерние узлы. Имея такое дерево, очень легко выводить его в постфиксную, префиксную или инфиксную нотацию. Какие методы, такие как [рекурсивный спуск] (http://en.wikipedia.org/wiki/Recursive_descent_parser), это сделать это дерево в стеке, вместо того, чтобы создавать древовидную структуру вручную, хотя последняя более гибкая. Рекурсивный спуск тоже очень хорош. –
Что означает «компилятор бросает точку останова»? –