Как обменять два верхних предмета в стеке? - PostFix калькулятор (решен) - PullRequest
0 голосов
/ 23 октября 2019

Я пытаюсь добавить новые функции в калькулятор PostFix.

Ожидаемое поведение будет таким: если я, например, наберу 3 2 x -, то оно будет рассчитываться как 2 - 3, а не 3 - 2. Нажатие x должно поменять местами элементы во время выполнения.

Я пытался придумать разные способы сделать это, но я просто не понимаю, как я мог это сделать.

#include <iostream>
#include "Stack.h"
using namespace std;

char get_command()
{
    char command;
    bool waiting = true;
    cout 
        << "Select command and press <Enter>:" << endl;

    while (waiting) {
        cin >> command;
        command = tolower(command);
        if (command == '?' || command == '=' || command == '+' ||
            command == '-' || command == '*' || command == '/' ||
            command == 'q' || command == 'x') waiting = false;


        else {
            cout << "Please enter a valid command:" << endl;
        }
    }
    return command;
}

bool do_command(char command, Stack& numbers)

{
    double p, q;
    switch (command) {
    case '?':
        cout << "Enter a real number: " << flush;
        cin >> p;
        if (numbers.push(p) == overflow)
            cout << "Warning: Stack full, lost number" << endl;
        break;

    case '=':
        if (numbers.top(p) == underflow)
            cout << "Stack empty" << endl;
        else
            cout << p << endl;
        break;

    case '+':
        if (numbers.top(p) == underflow)
            cout << "Stack empty" << endl;
        else {
            numbers.pop();
            if (numbers.top(q) == underflow) {
                cout << "Stack has just one entry" << endl;
                numbers.push(p);
            }

            else {
                numbers.pop();
                if (numbers.push(q + p) == overflow)
                    cout << "Warning: Stack full, lost result" << endl;
            }
        }
        break;

    case '-':
        if (numbers.top(p) == underflow)
            cout << "Stack empty" << endl;
        else {
            numbers.pop();
            if (numbers.top(q) == underflow) {
                cout << "Stack has just one entry" << endl;
                numbers.push(p);
            }

            else {
                numbers.pop();
                if (numbers.push(q - p) == overflow)
                    cout << "Warning: Stack full, lost result" << endl;
            }
        }
        break;

    case '*':
        if (numbers.top(p) == underflow)
            cout << "Stack empty" << endl;
        else {
            numbers.pop();
            if (numbers.top(q) == underflow) {
                cout << "Stack has just one entry" << endl;
                numbers.push(p);
            }

            else {
                numbers.pop();
                if (numbers.push(q * p) == overflow)
                    cout << "Warning: Stack full, lost result" << endl;
            }
        }
        break;

    case '/':
        if (numbers.top(p) == underflow)
            cout << "Stack empty" << endl;
        else {
            numbers.pop();
            if (numbers.top(q) == underflow) {
                cout << "Stack has just one entry" << endl;
                numbers.push(p);
            }

            else {
                numbers.pop();
                if (numbers.push(q / p) == overflow)
                    cout << "Warning: Stack full, lost result" << endl;
            }
        }
        break;

    case 'x':
        if (numbers.top(p) == underflow)
            cout << "Stack empty" << endl;
        else {
            numbers.pop();
            if (numbers.top(q) == underflow) {
                cout << "Stack has just one entry" << endl;
                numbers.push(p);
            }

            else {
                numbers.pop();
                numbers.pop();
                numbers.push(p);
                numbers.push(q);
        }
        break;

    case 'q':
        cout << "Calculation finished.\n";
        return false;
    }

    return true;

}

int main()
{

        Stack stored_numbers;
        help();
        while (do_command(get_command(), stored_numbers));  

}
...