Я создаю калькулятор целочисленных значений обратной польской нотации в c ++, написав динамический стек на основе указателей, но у меня возникают проблемы с реализацией операций сложения с вычитанием и т. Д. Для каждого элемента моего связанного списка
здесьнемного о том, как должен работать мой код:
Описание методов:
constructor: Инициализирует объект, настраивая необходимую память.деструктор: освобождает любую память, которая может нуждаться в освобождении объектом.clear (): очищает стек.pop (): удаляет и возвращает верхнее значение в стеке, если оно не пустое.Выдает исключение, если стек пуст при попытке выскочить.Выберите любое исключение.push (int): принимает целое число в качестве единственного аргумента и помещает его в стек, если достаточно памяти.size (): возвращает размер стека в виде целого числа.toString (): возвращает строковое представление стека.Например, если в стеке есть 8, 3, 2, 5 с 8 наверху, то это вернет [8, 3, 2, 5], отформатированный в точности так.Калькулятор должен будет поддерживать следующие операции:
- : сложение
- : вычитание
- : умножение /: деление%: модуль?: вывести текущее содержимое стека на экран с помощью метода toString ().^: выскакивает верх стека и отображает только вытолкнутое значение.!: выходит из калькулятора.Калькулятор будет постоянно читать входные данные до!введен.Он может читать любое количество токенов в качестве входных данных (см. Ниже).Если в стеке недостаточно целых чисел для выполнения вычисления, # Не хватает аргументов.должен отображаться.Если введено что-либо, кроме целых чисел или поддерживаемых операций, появится сообщение об ошибке # Недопустимый ввод.должен отображаться без прерывания остальных операций для конкретной строки ввода.
У меня проблемы с функциями добавления / вычитания / деления / умножения / модуля в main.Как мне сделать это, используя методы и конструктор, который я создал?Вот мой код:
#include <iostream>
#include <list>
#include <string>
#include <algorithm>
#include <stack>
using namespace std;
struct Node
{
int data;
Node *next;
};
class MyStack
{
private:
Node *top;
public:
MyStack();
~MyStack();
void clear();
void push(int);
int pop();
int size();
string toString();
bool isEmpty();
int getNth(int); ////
};
int MyStack::size()
{
int count = 0; // Initialize count
Node* current = top; // Initialize current
while (current != NULL)
{
count++;
current = current->next;
}
return count;
}
int MyStack::getNth(int n)
{
Node* curr = top;
for (int i=0; i<n-1 && curr != NULL; i++)
curr = curr->next;
return curr->data;
}
MyStack::MyStack()
{
top = NULL;
};
MyStack::~MyStack()
{
while(!isEmpty())
{
pop();
}
};
void MyStack::push(int d)
{
Node *temp = new Node;
temp->data = d;
temp->next = top;
top = temp;
}
int MyStack::pop()
{
if(!isEmpty())
{
int value = top->data;
Node *oldtop = top;
top = oldtop->next;
delete oldtop;
return value;
} else
{
cout << "stack is empty"; //throw exception
exit(1);
}
}
void MyStack::clear()
{
top = NULL;
}
string MyStack::toString()
{
string result = "[";
bool needs_comma = false;
int n = size();
for (int i=n; i>=1; i--)
{
if (needs_comma) result += ", ";
needs_comma = true;
result += to_string(getNth(i));
}
result += "]";
return result;
};
bool MyStack::isEmpty()
{
return (top == NULL);
}
int main()
{
MyStack *s = new MyStack();
char choice;
string str;
while(cin >> str)
{
cout << str << endl;
if(str == "q")
break;
}
return 0;
}
Вот изображения моего ожидаемого вывода и того, как программа должна работать: