Как добавить, вычесть, умножить, разделить и найти модуль элементов связанного списка, реализованного как класс стека? - PullRequest
0 голосов
/ 26 июня 2019

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


}

Вот изображения моего ожидаемого вывода и того, как программа должна работать: run 1

run 2 run 3

...