Связанные списки стека pop () и isEmpty () не работают, понятия не имею, где ошибка - PullRequest
0 голосов
/ 29 апреля 2020

Я работаю над проектом и не могу преодолеть пару ошибок. Вот мой код

main ()

#include <iostream>
#include <cstddef>
#include "src\DynStack.cpp"
#include "include\DynStack.h"
#include "src\DynQue.cpp"
#include "DynQue.h"
#include <fstream>

using namespace std;

int main ()
{
    ifstream inputFile;
    ofstream outputFile;

    DynStack<char>cstack;

    inputFile.open("input.txt");

    if (!inputFile)
    {
        cout << "Error. No input file found." << endl;
    }
    else
    {
        char x;

        while (!inputFile.eof())
        {
            inputFile.get(x);

            cstack.push(x);

            cout << x;
        }

        inputFile.close();


        outputFile.open("output_reverse.txt");

        char y;

        int count = 1;

        while (cstack.isEmpty() == NULL)
        {
            cstack.pop(y);

            cout << y;

            count++;

        }

        outputFile.close();
    }



    cout << "Program completed." << endl;

    return 0;
}

DynStack. cpp

#include "DynStack.h"
#include <cstddef>
#include <iostream>

using namespace std;

template<typename T>
DynStack<T>::DynStack()
{
    top = NULL;
}

template<typename T>
void DynStack<T>::push(T val)
{
    StackNode *nodePtr; // ptr to traverse thru the stack
    StackNode *previousNode; // ptr to connect higher node to node below it

    StackNode *newNode;
    newNode = new StackNode; // makes a new StackNode
    newNode->value = val;
    newNode->next = NULL;

    if (top == NULL) // If the stack is empty
    {
        top = newNode; // Make newNode the first node;
    }
    else
    {
        nodePtr = top; // make our ptr = top

        newNode->next = nodePtr; // make the our new top node, newNode, point to the node below it

        top = newNode; // newNode is our new top of the stack

        delete nodePtr;
    }
}

template <typename T>
void DynStack<T>::pop(T& val)
{
    StackNode *nodePtr; // makes a nodePtr to traverse the stack

    nodePtr = top; // set nodePtr to point to top of stack

    if (top == NULL) // If stack is empty
    {
        cout << "Error. Stack is empty." << endl; // Provide error message.
        return;
    }
    else if (top->next == NULL) // If there is only one item in stack
    {
        val = top->value; // Make return value whatever the previous top was

        delete top; // Delete top

        top = NULL; // make top equal to null
    }
    else // If there is more than one item in stack
    {
            val = top->value; // Return value whatever previous top was

            nodePtr = nodePtr->next; // nodePtr point to node below top node

            delete top; // delete top node

            top = nodePtr; // make nodePtr our new top

            delete nodePtr; // delete the nodePtr
        }
}

template <typename T>
bool DynStack<T>::isEmpty()
{
    if (top == NULL) // If top node is null return true
    {
        return true;
    }
    if (top != NULL) // If top node is not null return false
    {
        return false;
    }
}



template <typename T>
DynStack<T>::~DynStack()
{
    //dtor
}

DynStack.h

#ifndef DYNSTACK_H
#define DYNSTACK_H

template <typename T>
class DynStack
{
    private:
        struct StackNode
        {
            T value;
            StackNode *next;
        };



    public:
        DynStack();
        ~DynStack();
        void push(T);
        void pop(T&);
        bool isEmpty();

        StackNode *top;
};

#endif // DYNSTACK_H

Идея этой программы заключается в мы берем входной файл «input.txt» со словами «Это оригинальный файл». и вывести его в другой текстовый файл в обратном порядке. Итак, ".elif lanigiro eht si sihT".

Мои проблемы:

для одного, когда я запускаю этот код, он печатает while (! InputFile.eof ()) просто отлично. Когда он запускается второй, пока l oop, а (cstack.isEmpty () == NULL) он печатает бесконечно. Я полагаю, что должно быть что-то не так с моей функцией pop () или isEmpty (), но я просто не вижу, что мне не хватает. Возможно, я устанавливаю top в NULL неправильно в pop (), но я не вижу, что изменить. Может быть, что-то не так с isEmpty (), но это кажется настолько простым, что я не знаю, что добавить.

Что еще важнее, хотя, когда я пытаюсь запустить это, вывод, который я получаю второй раз Я oop кажется, каждый раз по-другому. Иногда это ".ееее" повторяется. Иногда его ".el.el.el" повторяется. Иногда повторяется ".elif.elif.elif". Повторение «.elif.elif.elif» - это наиболее близкий к правильному выводу результат, так что, возможно, что-то не так с выводом или сохранением пробела ??

Понятия не имею. Если бы кто-нибудь мог увидеть, что случилось, и объяснить это мне, я был бы очень в долгу. Спасибо всем.

1 Ответ

0 голосов
/ 29 апреля 2020

возможно, на вашем push:

template<typename T>
void DynStack<T>::push(T val)
{
    StackNode *nodePtr; // ptr to traverse thru the stack
    StackNode *previousNode; // ptr to connect higher node to node below it

    StackNode *newNode;
    newNode = new StackNode; // makes a new StackNode
    newNode->value = val;
    newNode->next = NULL;

    if (top == NULL) // If the stack is empty
    {
        top = newNode; // Make newNode the first node;
    }
    else
    {
        nodePtr = top; // make our ptr = top

        newNode->next = nodePtr; // make the our new top node, newNode, point to the node below it

        top = newNode; // newNode is our new top of the stack

        delete nodePtr;
    }
}

вы удаляете nodePtr, который в данный момент удерживает значение top, a и поэтому вы удаляете все список

...