Я пытаюсь добавить новые функции в калькулятор 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));
}