Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在队列中实现Push功能_C++_Queue - Fatal编程技术网

C++ 在队列中实现Push功能

C++ 在队列中实现Push功能,c++,queue,C++,Queue,我不完全确定我在这里哪里出了问题,但我不断得到推送的奇怪值。 我不知道我的错误是在推送本身还是在显示中,但我假设它是在推送中。注意,这里的Push应该类似于“std::deque::Push_back” 以下是相关的实现代码: fsu::Queue <char> q; q.Push('a'); q.Display(std::cout, '\0'); 相关定义: void Push (const T& t); // push t onto queue void

我不完全确定我在这里哪里出了问题,但我不断得到推送的奇怪值。 我不知道我的错误是在推送本身还是在显示中,但我假设它是在推送中。注意,这里的Push应该类似于“std::deque::Push_back”

以下是相关的实现代码:

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

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);
void Push(const T&T);//把t推到队列上
无效显示(std::ostream&os,字符ofc='\0')常量;//输出内容
//通过操作系统
队列();//默认构造函数
队列(常量队列&);//复制构造函数
~Queue();//析构函数
队列和运算符=(常量队列&);//赋值运算符
私人:
类链接
{
Link(const T&T);//1参数构造函数
T元素;
链接*nextLink\ux;
好友类队列;
};
Link*firstLink;
Link*lastLink;
无效副本(const Queue&q);
静态链路*新链路(常数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;
  }
 }
模板
队列():firstLink\u0,lastLink\u0//默认构造函数
{
//空的
}
模板
fsu::Queue::Queue(const Queue&q):firstLink(0),lastLink(0)
{
副本(q);
}
模板
fsu::Queue&fsu::Queue::operator=(const Queue&q)//赋值运算符
{
如果(此!=&q)
{
清除();
副本(q);
}
归还*这个;
}
模板
fsu::Queue::Link::Link(const T&T):元素(T),nextLink(0)//1参数构造函数
{
};
模板
typename fsu::Queue::Link*fsu::Queue::NewLink(常量T&T)
{
Link*newLink=new(std::nothrow)Link(t);
如果(0==newLink)
{
//异常处理程序
标准:cerr
无效fsu::队列::复制(常量队列和q)
{
if(firstLink.=0)
{
标准::cerr元素);
qlink=qlink->nextLink;
}
}
模板
void fsu::Queue::Push(const T&T)//将T推到队列上
{
if(空())
{
链路*newLink=新链路(t);
新建链接->下一链接=空;
第一链接=新链接;
lastLink=新链接;
}
其他的
{
//实施
}
}
模板
void fsu::Queue::Display(std::ostream&os,char of c)常量//输出内容
//通过操作系统
{
操作系统
较短且更常见:

  os << firstLink_->_element << std::endl;
  os << lastLink_->_element << std::endl;
os\u元素
较短且更常见:

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

函数显示中的
os\u元素是否要打印指针地址,而不是其值?我正在尝试打印值,但在我尝试取消引用指针时,ostream显然不接受我的类型?在取消引用指针时,它尝试打印链接对象,为链接定义重载运算符>>类(指定要打印的内容)。在函数显示中,是否要打印指针地址而不是其值?我正在尝试打印该值,但在尝试取消引用指针时,ostream显然不接受我的类型?在取消引用指针时,它尝试打印链接对象,请为链接类定义重载运算符>>(指定要打印的内容)。在
os@JohnB中也一样,我尝试了这个方法,但得到了“二进制表达式的操作数无效('std::ostream'和'fsu::Queue::Link')”顺便说一句,一点也不混乱。哦,对不起,你的链接是一个包含_元素的结构。所以你必须先取消链接指针的引用以进入该结构,然后选择成员,即
os元素!我尝试了“firstLink”的每一个变体除此之外,这一点现在很明显。谢谢!你真是天赐良机!在
os@JohnB中也一样,我尝试过这个,但我得到了“二进制表达式的无效操作数('std::ostream'和'fsu::Queue::Link')”顺便说一句,一点也不混乱。哦,对不起,你的链接是一个包含_元素的结构。所以你必须首先取消链接指针的引用,以进入该结构,然后选择成员,即
os元素u!除此之外,我还尝试了“firstLink”u->“firstLink”的所有变体。这一点现在很明显。谢谢!你真是天赐之物!
  os << (*firstLink_)._element << std::endl;
  os << (*lastLink_).element << std::endl;
  os << firstLink_->_element << std::endl;
  os << lastLink_->_element << std::endl;