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

Я создаю калькулятор целочисленных значений обратной польской нотации в c ++, написав динамический стек на основе указателей, но у меня возникли проблемы с методом toString в классе MyStack.

Вот немного фона о том, как мой код должен работать:

Описание методов:

  • constructor: инициализация объекта, настройка необходимой памяти.
  • destructor: освобождает любую память, которая может нуждаться в освобождении объектом.
  • clear(): очищает стек.
  • pop(): Удаляет и возвращает верхнее значение в стеке, если оно не пустое. Выдает исключение, если стек пуст при попытке выскочить. Выберите любое исключение.
  • push(int): принимает целое число в качестве единственного аргумента и помещает его в стек, если достаточно памяти.
  • size(): возвращает размер стека в виде целого числа.
  • toString(): возвращает строковое представление стека. Например, если в стеке содержится 8, 3, 2, 5 с 8 наверху, то это вернет [8, 3, 2, 5], отформатированный в точности так:

Калькулятор должен будет поддерживать следующие операции:

  • +: добавление
  • -: вычитание
  • *: умножение
  • /: деление
  • %: модуль
  • ?: вывести текущее содержимое стека на экран с помощью метода toString ().
  • ^: выскакивает верхняя часть стека и отображает только извлеченное значение.
  • !: выход из калькулятора.

Калькулятор будет непрерывно считывать ввод до! введен. Он может читать любое количество токенов в качестве входных данных (см. Ниже). Если в стеке недостаточно целых чисел для выполнения вычисления, должно отображаться #Not enough arguments.. Если введено что-либо, кроме целых чисел или поддерживаемых операций, должно отображаться сообщение об ошибке #Invalid input., не прерывая остальные операции для конкретной строки ввода.

У меня проблемы с методом toString. Как преобразовать стек целых чисел в строки?

Мой код:

//  main.cpp
//  practice2
#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();
};
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);
    }
}

string MyStack::toString()
 {
    //redo later
 };

bool MyStack::isEmpty()
{
    return (top == NULL);
}
int main()
{
    MyStack *s = new MyStack();

    s->push(8);
    s->push(3);
    s->push(2);
    s->push(5);
    delete s;
    return 0;
}

Ожидаемый результат:

toString(): возвращает строковое представление стека. Например, если в стеке содержится 8, 3, 2, 5 с 8 наверху, то это вернет [8, 3, 2, 5], отформатированный в точности так:

1 Ответ

1 голос
/ 26 июня 2019

Что-то вроде

string MyStack::toString()
 {
    string result = "[";
    bool needs_comma = false;
    for (Node* temp = top; temp != nullptr; temp = temp->next) {
        if (needs_comma) result += ", ";
        needs_comma = true;
        result += std::to_string(temp->data);
    }
    result += "]";
    return result;
 };

должно сработать.

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