Класс стека шаблонов: в стеке нет данных

Функция pop () — это функция с ошибкой возвращаемого типа. Функция говорит, что возвращает объект Stack, но данные находятся в структуре Node. Как мне сделать так, чтобы он возвращал правильные данные?

Согласно моей функции отображения, похоже, что данные не попадают в стек.

Добавление newNode-> mData = data и проверка путем отладки выглядит так, как будто вещи попадают в стек. Похоже, что с функцией отображения может быть проблема.

Я также не уверен, что мои функции push и isExist верны …

/*      Pre:  The stack is initialized and searchKey is available
*     Post:  The function retuns true if the searchKey exists in the queue;
*            otherwise return false
*  Purpose:  To determine if a given value exists in the stack or not
*************************************************************************/
template <class T>
bool Stack<T>::isExist(T searchKey)
{
bool exist = false;
Node<T> *temp = mHead;

if (mHead == NULL)
{
exist = false;
}

else if (temp->mData == searchKey)
{
exist = true;
}

else
{
while (temp->mNext != NULL)
{
if (temp->mData == searchKey)
{
exist = true;
break;
}

temp = temp->mNext;
}
}

return exist;
}/*      Pre:  The stack is initialized
*     Post:  The first node in the stack is removed, and its content is
*            returned.  If the stack is empty return the default value
*            for the given data type
*  Purpose:  To remove the first node in the stack
*************************************************************************/
template <class T>
T Stack<T>::pop()
{
//Temp holds the mem location of the data
//that will be popped/returned
Node<T> *temp = mHead;

if (mHead == NULL)
{
return NULL;
cout << "The stack is empty!";
}

//Makes the next node in the stack the top one
else if (mHead->mNext == NULL )
{
mHead = NULL;
mTail = NULL;
}

else
{
mHead = mHead->mNext;
}

//Increment the counter down for the popped node
mCount--;

return temp->mData;
}/*      Pre:  The stack is initialized
*     Post:  The new node is added at the beginning of the stack.
*            Duplication is allowed
*  Purpose:  To add a new node at the beginning of the stack
*************************************************************************/
template <class T>
void Stack<T>::push(T data)
{
Node<T> *newNode = new Node<T>;
newNode->mData = data;

//If the stack is empty
if (mHead == NULL && mTail == NULL)
{
mHead = newNode;
mTail = newNode;
}

//Otherwise mHead will be the new node's next node
//The new node becomes the head
else
{
newNode->mNext = mHead;
mHead = newNode;
}

//Increment the counter to reflect the new node
mCount++;
}
template <class T>
void Stack<T>::display()
{
Node<T> *tmp;

if (isEmpty())
cout << "Empty Stack\n";
else
{
tmp = mHead;

while (tmp != NULL)
{
cout << tmp->mData << " ";
tmp = tmp->mNext;
}
cout << endl;
}
}
    #ifndef STACK_H
#define STACK_H

#include <iostream>

using namespace std;

template <class T>
class Stack {
private:
template <class T>
struct Node
{
T       mData;
Node<T> *mNext;

/*      Pre:  None
*     Post:  This object is initialized using default values
*  Purpose:  To intialize date object
*************************************************************************/
Node()
{
mData = T();
mNext = NULL;
}/*      Pre:  None
*     Post:  This object is initialized using specified data
*  Purpose:  To intialize date object
*************************************************************************/
Node(T data)
{
mData = data;
mNext = NULL;
}
};

Node<T> *mHead, *mTail;
int     mCount;

public:
Stack();
~Stack();

int  getCount();

void clear();
void display();
bool isEmpty();
bool isExist(T searchKey);
T    pop();
void push(T data);
};template <class T>
Stack<T>::Stack()
{
mHead  = NULL;
mTail  = NULL;
mCount = 0;
}template <class T>
Stack<T>::~Stack()
{
while (!isEmpty())
pop();
}template <class T>
int Stack<T>::getCount()
{
return mCount;
}template <class T>
void Stack<T>::clear()
{
while (!isEmpty())
pop();
}template <class T>
void Stack<T>::display()
{
Node<T> *tmp;

if (isEmpty())
cout << "Empty Stack\n";
else
{
tmp = mHead;

while (tmp != NULL)
{
cout << tmp->mData << " ";
tmp = tmp->mNext;
}
cout << endl;
}
}template <class T>
bool Stack<T>::isEmpty()
{
return mCount == 0;
}#endif

0

Решение

Вам не хватает шага в вашем толчке, чтобы установить данные!

template <class T>
void Stack<T>::push(T data)
{
Node<T> *newNode = new Node<T>;
//HERE! vv
newNode->mData = data;
//THERE! ^^

//If the stack is empty
if (mCount == 0)
{
mHead = newNode;
mTail = newNode;
}

//Otherwise mHead will be the new node's next node
//The new node becomes the head
else
{
newNode->mNext = mHead;
mHead = newNode;
}

//Increment the counter to reflect the new node
mCount++;
}

(Пользователь исправил зачеркнутый текст в редактировании)

Другие вещи для размышления: что это mTail переменная, а что с ней должно происходить?

Посмотри на свой isExist функция … Спросите себя, что произойдет, если вы нажмете номер, а затем спросите, существует ли этот номер? Будет ли это работать как задумано? Что произойдет, если вы попытаетесь выскочить из пустого стека? Что произойдет, если вы вызовете isExist для пустого стека?

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]