Member 13476370 Ответов: 2

Преобразование инфикса в постфикс


при отладке : стек оценщика успешно зарезервирован в памяти
но ценности вовсе не толкутся! не знаете, что случилось ? почему значения не помещаются в стек ? зная, что я использовал свою реализацию стека в другой программе, и она хорошо работала !!

Что я уже пробовал:

void infixTopostfix(char infix[], char postfix[]){
 int i,j=0;
Stack* evaluator = initialize();
 for(i=0; infix[i] ; ++i){
    if(isdigit(infix[i])) {
            postfix[j++] = infix[i];}
    else {
            while(!isempty(evaluator) && precedence(infix[i]) <= precedence((char)top(evaluator)))
                {postfix[j++] = pop(evaluator);}
                 push(evaluator,(int)infix[i]);

        }
                    }
                postfix[j++] = '\0';
                printf("%s",postfix);
 }


моя реализация стека
#include<stdlib.h>
#include<stdio.h>
#define SIZE 100
typedef struct
{
    int top;
    int *items;
} Stack;
Stack* initialize()
{
    Stack *s=malloc(sizeof(Stack));
    s->top=0;
    s->items=(int*) malloc(SIZE*sizeof(int));
    return s;
}
int isfull(Stack *s)
{
    return s->top >= SIZE ?1:0 ;
}
int isempty(Stack *s)
{
    return s->top==0?1:0;
}

void push(Stack *s,int value)
{
    if(!isfull(s))
        s->items[s->top++]=value;
    else printf("stack is full");
}
int pop(Stack *s)
{
    if(!isempty(s))
        return s->items[--s->top];
    else printf("stack is empty");
    return 404;
}
int top(Stack* s){
if(isempty(s)) return 0;
return (s->items[s->top]);
}

2 Ответов

Рейтинг:
1

nv3

Если бы вы использовали отладчик, то увидели бы, что функция top работает неправильно. s->top обычно указывает на одну запись выше нынешняя вершина. Следовательно, последняя строка должна гласить::

возвращение с-&ГТ;элементы[Ы-и GT;топ-1];

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


Рейтинг:
1

Patrice T

Цитата:
но ценности вовсе не толкутся! не знаете, что случилось ? почему значения не помещаются в стек ?

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

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

Приятно показать какой-то код, но лучше автономный кусок кода, который мы можем запустить.