C++ 在队列中实现Push功能
我不完全确定我在这里哪里出了问题,但我不断得到推送的奇怪值。 我不知道我的错误是在推送本身还是在显示中,但我假设它是在推送中。注意,这里的Push应该类似于“std::deque::Push_back” 以下是相关的实现代码: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
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;