在队列中实现Push功能

时间:2013-12-06 08:29:32

标签: c++ queue

我不完全确定我在哪里出错了但是我一直在为Push增加奇怪的价值。 我不知道我的错误是在Push本身还是在Display中,但我认为它是在Push中。请注意,Push here应该类似于“std :: deque :: push_back”。

以下是相关的实施代码:

fsu::Queue <char> q;
q.Push('a');
q.Display(std::cout, '\0');

这是我得到的:

0x100100a20
0x100100a20
0x0

相关定义:

void      Push    (const T& t); // push t onto queue
void      Display (std::ostream& os, char ofc = '\0') const; // output contents
                                    //through os
queue             ();              // default constructor
Queue             (const Queue&);  // copy constructor
~Queue            ();              // destructor
Queue& operator = (const Queue&);  // assignment operator

private:
    class Link
    {
        Link ( const T& t );  // 1-parameter constructor
        T      element_;
        Link * nextLink_;
        friend class Queue<T>;
    };
Link * firstLink_;
Link * lastLink_;

void         Copy   (const Queue<T>& q);
static Link* NewLink(const T& t);

以下是我实施的内容:

template < typename T >
fsu::Queue<T>::Queue () : firstLink_(0), lastLink_(0)              // default constructor
{
  //empty
}

template < typename T >
fsu::Queue<T>::Queue (const Queue& q) : firstLink_(0), lastLink_(0)
{
  Copy(q);
}

template < typename T >
fsu::Queue<T>& fsu::Queue<T>::operator = (const Queue& q) // assignment operator
{
  if (this != &q)
  {
    Clear();
    Copy(q);
  }
  return *this;
}

template < typename T >
fsu::Queue<T>::Link::Link ( const T& t ) : element_(t), nextLink_(0)  // 1-parameter     constructor
{
};

template < typename T >
typename fsu::Queue<T>::Link* fsu::Queue<T>::NewLink (const T& t)
{
  Link * newLink = new(std::nothrow) Link (t);
  if (0 == newLink)
  {
    // exception handler
    std::cerr << "** Queue error: memory allocation failure\n";
    return 0;
  }
  return newLink;
}

template < typename T >
void fsu::Queue<T>::Copy (const Queue<T>& q)
{
  if (firstLink_ != 0)
  {
    std::cerr << "** Error: Queue::Copy called by non-empty object\n";
    //  exit(EXIT_FAILURE);
  }
  if (q.firstLink_ == 0)
    return;
  Link* qlink = q.firstLink_;
  while (qlink != 0)
  {
    Push(qlink -> element_);
    qlink = qlink -> nextLink_;
  }
  }

template < typename T >
void fsu::Queue<T>::Push (const T& t) // push t onto queue
{
if (Empty())
{
    Link * newLink = new Link(t);
    newLink -> nextLink_ = NULL;
    firstLink_ = newLink;
    lastLink_ = newLink;
}
else
{
    //to be implemented
}
}

template < typename T >
void fsu::Queue<T>::Display (std::ostream& os, char ofc) const // output contents
// through os
{
  os << firstLink_ << std::endl;
  os << lastLink_ << std::endl;
  Link * currLink = firstLink_;
  while (currLink)
  {
    currLink = currLink -> nextLink_;
    os << currLink << std::endl;
  }
 }

1 个答案:

答案 0 :(得分:1)

  os << firstLink_ << std::endl;
  os << lastLink_ << std::endl;

打印指向的地址(即变量携带的值),而不是指向的项目。

你必须取消引用指针!然后你得到一个Link结构,然后你必须选择你要打印的_element成员:

  os << (*firstLink_)._element << std::endl;
  os << (*lastLink_).element << std::endl;

更短更常见:

  os << firstLink_->_element << std::endl;
  os << lastLink_->_element << std::endl;

明确取消引用的必要性是,例如Java和C#,其中引用被程序员“隐藏”并由语言处理。在C和C ++中,指针变量只保存一个内存地址。你可以直接操作内存地址(google用于“指针算术”);因此,有必要将指针值(即地址)与指向该值的值区分开来。

希望这不会太混乱。