【问题标题】:Quick Question: Why isn't my call for pop() working? C++ Stacks快速问题:为什么我对 pop() 的调用不起作用? C++ 堆栈
【发布时间】:2020-08-11 18:43:03
【问题描述】:

我正在当前的 CS 课程中学习堆栈。我正在研究函数,当我去测试时,对于 pop 函数,我得到了错误: "没有匹配的函数调用 DynStack::pop()"

这是我的代码:

main()

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

using namespace std;


int main()
{
    DynStack<char>cstack;
    cstack.push('A');
    cstack.push('B');
    cstack.push('C');

    cstack.pop();

    cout << cstack.top->value << endl;

    return 0;
}

DynStack.cpp

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

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 *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

        nodePtr->next = newNode; // make the node after the top our newNode

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

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

    if (top == NULL)
    {
        return;
    }
    else
    {
        nodePtr = top;
        nodePtr = top--;
        delete top;
        top = nodePtr;
        delete nodePtr;
    }

}




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;
        };

        StackNode *top;

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

#endif // DYNSTACK_H

我还处于测试这个程序的早期阶段。我假设我必须在 cstack.pop(); 的括号中放一些东西,但我不知道我会放什么? Pop 只会删除一个值,是吗?我认为它不需要任何输入。

如果是我的程序,我会考虑从 void DynStack::pop(T &) 中删除 T&,但这是我的教授放在那里的。我想他把那个放在那里,所以我必须学习这个。谷歌搜索了一堆,但没有靠近。

谢谢大家。

【问题讨论】:

  • 也许您的教授希望您将弹出的元素放入参数中,因此T&amp;
  • 通常我建议您编译和链接 cpp 文件并包含 .h 文件,但在这种情况下,您在该 cpp 中实现了一个模板。文件。 II 建议重命名它以使用不同的扩展名。 1.你会迷惑人。 2.你会混淆一些构建工具。
  • 您的函数需要一个引用参数,但您没有提供。

标签: c++ function linked-list stack lifo


【解决方案1】:

在你的代码中

void pop(T&);

T& 表示此函数需要 T 类型的(参考)参数(在您的情况下为 char)。您没有提供一个,因此代码无法编译。您需要在代码中添加一个 char 变量

char x;
cstack.pop(x);
cout << "the top item on the stack was " << x << endl;

我认为您缺少的是 pop 不仅从堆栈中删除一个项目,它还通过引用参数“返回”该项目。

【讨论】:

  • 谢谢! @john 这完全是我没有得到的。一旦我将 char 变量放入代码中,它就可以正常工作。不知道它应该返回一些东西。
猜你喜欢
  • 2019-06-22
  • 2015-11-18
  • 2011-06-20
  • 1970-01-01
  • 2010-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-07
相关资源
最近更新 更多