Brock02 Ответов: 2

Как выполнить постфиксную операцию с многозначными операндами


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

Моя программа отлично работает для однозначных операндов, таких как 0 и 9 . Но для многозначных операндов, таких как 10,55,99, он работает неправильно.

Например: результат, который я хочу, таков
12 5 * = 60, но это дает неправильный ответ.

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

Используемый алгоритм приведен ниже:

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

#include<stdio.h>
#include<iostream>
using namespace std;
int s[50];
int top=-1;
int space(char ch);

int push(int elem)
{
    s[++top]=elem;
    return 0;
}

int pop()
{
    return(s[top--]);
}

int space(char ch)
{
    if( ch == ' ' || ch == '\t' )
        return 1;
    else
        return 0;
}

main()
{
    char pofx[50],ch;
    int i=0;
    int op1,op2;
    printf("\n\nRead the Postfix Expression ? ");
    gets(pofx);
    while( (ch=pofx[i++]) != '\0')

    {
        if(isdigit(ch)) push(ch-'0');
        else
        {
            op2=pop();
            op1=pop();
            if(!space(ch))
            {
                switch(ch)
                {
                /*case ' ':
                    break;
                case '\t':
                    break;*/
                case '+':
                    push(op1+op2);
                    break;
                case '-':
                    push(op1-op2);
                    break;
                case '*':
                    push(op1*op2);
                    break;
                case '/':
                    push(op1/op2);
                    break;
                case '^':
                    push(op1^op2);
                    break;
                }
            }

        }

    }

    printf("\n Given Postfix Expn: %s\n",pofx);
    printf("\n Result after Evaluation: %d\n",s[top]);
}

2 Ответов

Рейтинг:
2

Jochen Arndt

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

Вход: "12 5 *"
1: s[0] = 1
2: s[1] = 2
Пространство: op2 = s[1] = 2, op1 = s[0] = 1
5: s[0] = 5
Пространство: op2 = s[0] = 5, op1 = s[-1] = неопределенно
*:

Простое решение разделило бы входные данные на пробелы и операции.
Для получения числовых значений я предлагаю использовать strtol-ссылка на C++ [^] (или strtod-ссылка на C++ [^] для значений с плавающей запятой) с помощью endptr параметр для проверки того, какой символ останавливает преобразование.

Пример:

char *endptr;
char *parse = pofx;
while (1)
{
    long val = strtol(parse, &endptr, 10);
    // Break when not a number followed by a space
    if (endptr == parse || ' ' != *endptr)
        break;
    push(val);
    // Resume behind space
    parse = endptr + 1;
}
// At this point *endptr should contain the operation character


Рейтинг:
1

Patrice T

Чтобы увидеть, что делает ваш код, отладчик-это инструмент выбора.
Ваша проблема здесь:

if(isdigit(ch)) push(ch-'0');

каждая цифра обрабатывается индивидуально.
Вам нужно понять, что цифра, перед которой стоит другая цифра, - это не новое число, а часть предыдущего.

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

Отладчик позволяет вам следить за выполнением строка за строкой, проверять переменные, и вы увидите, что есть точка, в которой он перестает делать то, что вы ожидаете.
Отладчик-Википедия, свободная энциклопедия[^]
Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]

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

Отладчик поможет вам улучшить понимание вашего кода, но ot-это опыт от первого лица, Ni body может сделать это за вас.