Проблема с реализацией стека в C ++ - PullRequest
0 голосов
/ 11 мая 2019

Я должен решить упражнение о стеках в C ++. Мне нужно реализовать класс Stack, который поддерживает операции pop () и push (). Мой ввод - это файл input.txt, который содержит 100 строк. Каждая строка содержит 2 + N элементов: первая представляет собой строку, которая показывает тип, а вторая представляет собой int N, который показывает количество элементов. Следует за N элементов. Что касается вывода, элементы должны быть записаны в output.txt в обратном порядке. Универсальный тип H может быть int, bool, double и char. N является целым числом от 10 до 200.

Пример:

input.txt:

int 5 4 7 8 12 32

char 7 g h t e e j

двойной 4 2,78 3,73 4,12 31,92

output.txt:

32 12 8 7 4

j d e a t h g

31,92 4,12 3,73 2,78

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

malloc (): размер поврежденной вершины Отменено

#include <iostream>
#include <fstream>

using namespace std;

template <typename T> class Stack {
private:
    int top;
    T *arrayStack;
    int size;

public:
    Stack(int len = 200) {
        arrayStack = new T(len);
        top = -1;
        size = len;
    }

    void push(T element) {
        if(top < size-1) {
            top++;
            arrayStack[top] = element;
        }
        else
            return;
    }

    T pop() {
        if(top == -1)
            return -1;
        else {
            top--;
            return arrayStack[top+1];
        }
    }
};

int main() {    
    int intero = 0;
    char carattere = '0';
    bool booleano = true;
    double virgola = 0.00;

    ifstream in("input.txt");
    ofstream out("output.txt");
    int n;
    string tipo;

    for(int i=0; i<100; i++) {
        in >> tipo;
        in >> n;
        if(tipo == "int") {
            Stack<int> pila(n);

            for(int i=0; i<n; i++) {
                in >> intero;
                pila.push(intero);
            }

            for(int i=0; i<n; i++)
                out << pila.pop() << " ";
        }
        else if(tipo == "char") {
            Stack<char> pila(n);

            for(int i=0; i<n; i++) {
                in >> carattere;
                pila.push(carattere);
            } 

            for(int i=0; i<n; i++)
                out << pila.pop() << " ";
        }
        else if(tipo == "bool") {
            Stack<bool> pila(n);

            for(int i=0; i<n; i++) {
                in >> booleano;
                pila.push(booleano);
            }

            for(int i=0; i<n; i++)
                out << pila.pop() << " ";

        }
        else if(tipo == "double") {
            Stack<double> pila(n);

            for(int i=0; i<n; i++) {
                in >> virgola;
                pila.push(virgola);
            }

            for(int i=0; i<n; i++)
                out << pila.pop() << " ";
        }
        out << endl;
    } 
}

1 Ответ

2 голосов
/ 11 мая 2019

Используйте new T[len] вместо new T(len).

new T(len) создает один экземпляр T, а конструктор T принимает len в качестве параметра.

new T[len] создает массив из T с len элементами.

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