Понимание кода оценки выражения postfix - PullRequest
0 голосов
/ 12 октября 2011

Я пытаюсь понять этот кусок кода. Что он делает, это постфиксное выражение выражения. У меня проблемы с пониманием кода. Я буду очень благодарен, если кто-нибудь сможет мне помочь.

#include <iostream>
#include <cstring>
#include <stack>
using namespace std;
int main()
{


    //suppose a contains the string..
    //n is the length of string...
    char a[10]="A+B/C";
    int n = strlen(a)
    stack<int>s;
    for (int i=0;i<n;i++)
    {
        if (a[i]=='+')
        {
            s.push(s.pop()+s.pop());
            int temp1 = s.top();
            s.pop();
            int temp2 = s.top();
            s.pop();
            s.push(temp1 * temp2);
        }
        if (a[i]=='*')
            s.push(s.pop() * s.pop());

        if ((a[i]>='0') && (a[i]<='9'))
            s.push(0);
        while ((a[i]>='0') && (a[i]<='9'))
            s.push(10*s.pop()+(a[i++]-'0'));
    }

    cout<<s.pop()<<endl;

    return 0;
}

Заранее спасибо.

1 Ответ

1 голос
/ 16 октября 2011

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

Скажем, у вас есть инфиксное выражение 1 + 2 * 3-4 * 5. Соответствующий постфикс будет 123 * + 45 * -. Сначала вы сканируете строку слева направо. Первые три числа являются операндами, поэтому они будут храниться в стеке в порядке 1 (внизу), 2 (в середине), 3 (вверху). Далее есть оператор *. Чтобы справиться с этим, вытолкните первые два операнда из стека и умножьте их (первый вытолкнутый является правым операндом, а второй - левым). Это даст оценку 2 * 3 = 6, и 6 будет сохранено в стеке, что сделает его 1, 6.

Далее есть оператор +. 1 и 6 выталкиваются и добавляются, а 7 сохраняется в стеке. После этого 4 и 5 также помещаются в стек (7, 4, 5). Следующим символом является другой оператор *, поэтому он оценивает 4 * 5 = 20 и помещает 20 в стек (7, 20).

Наконец, есть оператор -. 7 и 20 выталкиваются и оцениваются как 7-20 = (- 13). Это помещено в стек и готово быть выданным как ваш окончательный ответ.

Надеюсь, это поможет прояснить ситуацию (если я правильно прочитал ваш вопрос).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...