#c #stack #postfix-notation #infix-notation
#c #стек #постфиксная нотация #инфиксная нотация
Вопрос:
Я пишу программу, которая считывает инфиксную нотацию, преобразует ее в постфиксную и затем оценивает этот постфикс. Вот моя программа:
#include<stdio.h>
#include <ctype.h>
#define SIZE 50 /* Size of Stack */
char s[SIZE];
int top = -1; /* Global declarations */
push(char elem) { /* Function for PUSH operation */
s[ top] = elem;
}
char pop() { /* Function for POP operation */
return (s[top--]);
}
int pr(char elem) { /* Function for precedence */
switch (elem) {
case '#':
return 0;
case '(':
return 1;
case ' ':
case '-':
return 2;
case '*':
case '/':
return 3;
}
}
pushit(int ele){ /* Function for PUSH operation */
s[ top]=ele;
}
int popit(){ /* Function for POP operation */
return(s[top--]);
}
main() { /* Main Program */
char infx[50], pofx[50], ch, elem;
int i = 0, k = 0, op1, op2,ele;
printf("nnRead the Infix Expression ");
scanf("%s", infx);
push('#');
while ((ch = infx[i ]) != '') {
if (ch == '(')
push(ch);
else if (isalnum(ch))
pofx[k ] = ch;
else if (ch == ')') {
while (s[top] != '(')
pofx[k ] = pop();
elem = pop(); /* Remove ( */
} else { /* Operator */
while (pr(s[top]) >= pr(ch))
pofx[k ] = pop();
push(ch);
}
}
while (s[top] != '#') /* Pop from stack till empty */
pofx[k ] = pop();
pofx[k] = ''; /* Make pofx as valid string */
printf("nnGiven Infix Expn: %s Postfix Expn: %sn", infx, pofx);
while( (ch=pofx[i ]) != '')
{
if(isdigit(ch)) pushit(ch-'0'); /* Push the operand */
else
{ /* Operator,pop two operands */
op2=popit();
op1=popit();
switch(ch)
{
case ' ':pushit(op1 op2);break;
case '-':pushit(op1-op2);break;
case '*':pushit(op1*op2);break;
case '/':pushit(op1/op2);break;
}
}
}
printf("n Given Postfix Expn: %sn",pofx);
printf("n Result after Evaluation: %dn",s[top]);
}
Программа правильно преобразует мой инфикс в постфиксную нотацию. Однако для части оценки он всегда возвращает 0 в результате.
Кроме того, при преобразовании из инфикса в постфикс я хотел бы печатать результат на каждом шаге, как я могу это сделать?
Комментарии:
1. Небольшое замечание: Интересное название:
pushit
. Это делает p.u.2. Примечание: если ваша запись содержит пробелы, то
scanf("%s", infx);
не будет сканироваться вся строка.3. Слишком много кода, слишком мало отладки.
4. @chux хахахахаха… Я обратил на это внимание только тогда, когда вы указали на это. Не беспокойтесь, я изменил имена функций!
Ответ №1:
Одна из проблем заключается в том, что вы сохраняете значения в s
виде символа с сохранением 1 байта на элемент, а затем пытаетесь вставить целые числа в s
с:
pushit (int ele) { /* Function for PUSH operation */
s[ top] = ele;
}
После смешивания int / char в s
вы пытаетесь прочитать:
op2=popit();
op1=popit();
которая пытается создать int
из popit()
. popit()
это просто 1 байт char
. Таким образом, op1
и op2
не получают желаемых значений:
int popit(){ /* Function for POP operation */
return(s[top--]);
}
Вам нужно посмотреть, как вы храните целые числа, если вы ожидаете получить целые числа обратно. Наконец, посмотрите на свои предупреждения. Как минимум, сборка с -Wall
опцией. Это показывает:
popit.c:8:1: warning: return type defaults to ‘int’
popit.c:32:1: warning: return type defaults to ‘int’
popit.c:41:1: warning: return type defaults to ‘int’
Возможно, это то, что вы имели в виду. Однако ваш код должен создаваться без предупреждения, чтобы гарантировать, что он делает то, что вы думаете, что он делает.
Комментарии:
1. Да, вы правы!! Большое спасибо за вашу помощь! Наконец-то у меня получилось!
Ответ №2:
В строке нет. 9 Введите:
char push(char elem)
amp; Строка № 32
Тип:
int pushit(int ele)