Компилятор (GCC 4.2.1 на MacOS X 10.6.7) говорит мне:
$ cc -O -std=c99 -Wall -Wextra st.c -o st
st.c: In function ‘StackDisplay’:
st.c:72: warning: format ‘%c’ expects type ‘int’, but argument 2 has type ‘stackT’
st.c:74: warning: format ‘%c’ expects type ‘int’, but argument 2 has type ‘stackT’
$
В моей версии кода эти две строки являются операторами printf()
в StackDisplay()
,именно там, где вы заявляете, у вас есть проблемы.
void StackDisplay(stackT *stackP)
{
if(StackIsEmpty(stackP)) {
fprintf(stderr, "Can't display: stack is empty.\n");
exit(1);
}
int i;
printf("[ ");
for (i = 0; i < stackP->top; i++) {
printf("%c, ", stackP[i]); //the problem occurs HERE
}
printf("%c ]", stackP[stackP->top]);
}
Возможно, вы хотите stackP->contents[i]
.С этим исправлением программа «запускается», но выдает:
Can't pop element: stack is empty.
Это ваша проблема, которую нужно решить, сейчас.
(О, я также исправил ошибочную точку с запятойпосле цикла for
в main()
, как указано в комментариях.)
Цикл должен быть записан как strlen(expr)
(а затем вам нужно #include <string.h>
).Действительно, тело основной программы упрощается до:
char* expr = "1 2 3 + * 3 2 1 - + *";
printf("%d\n", postfix(expr, strlen(expr)));
Обычно top
следует индексировать для следующего используемого местоположения, поэтому начальное значение обычно будет 0
, а не-1
.
Не изучайте ASCII-коды для цифр - забудьте, что вы когда-либо это делали.
if ((expr[i] >= 48) && (expr[i] <= 57)) {
Вы должны написать:
if ((expr[i] >= '0') && (expr[i] <= '9')) {
или,лучше (но вы должны #include <ctype.h>
тоже):
if (isdigit(expr[i])) {
Аналогичные комментарии применимы к коммутатору:
switch (expr[i]) {
case 43: {
temp = StackPop(&stack);
StackPush(&stack, StackPop(&stack)+temp);
}
break;
Я не уверен в логике отступа, ночто 43 должно быть записано как '+'
, 45 как '-'
, 47 как '/'
, а 42 как '*'
.
Это создает:
Is a number! Pushed 49
Is a number! Pushed 50
Is a number! Pushed 51
Is a number! Pushed 51
Is a number! Pushed 50
Is a number! Pushed 49
68
Если вы исправите номер, нажимая код, как показано:
printf("Is a number! Pushed %d\n", expr[i] - '0');
StackPush(&stack, expr[i] - '0');
Тогда вы получите:
Is a number! Pushed 1
Is a number! Pushed 2
Is a number! Pushed 3
Is a number! Pushed 3
Is a number! Pushed 2
Is a number! Pushed 1
20
И с немного большим количеством инструментов, в соответствии с:
temp = StackPop(&stack);
printf("Sub: result %d\n", temp);
StackPush(&stack, temp);
после каждой операции результат:
Is a number! Pushed 1
Is a number! Pushed 2
Is a number! Pushed 3
Add: result 5
Mul: result 5
Is a number! Pushed 3
Is a number! Pushed 2
Is a number! Pushed 1
Sub: result 1
Add: result 4
Mul: result 20
20
Вы были близки.