C++利用链表模板类实现简易队列

本文实例为大家分享了C++利用链表模板类实现一个队列的具体代码,供大家参考,具体内容如下

设计思想:MyQueue.h中对模板类进行声明和实现。首先定义结点的结构体,包含数据和指针域两部分。队列类定义中声明和实现了元素入队,出队,打印队首元素和队列等方法。

注意:

1)模板类的声明和定义不能分开(即不能分别放在.h和.cpp文件里)。

2)声明新节点时,如果声明的节点是辅助操作的,可以不用new关键字,例如在析构函数中,直接用:Node<T>* temp;定义即可。如果声明一个新节点加入队列,则要用new关键字,否则会报出nullptr异常。

​ConsoleApplication.cpp

#include "stdafx.h"
#include "MyQueue.h"

int main()
{
 MyQueue<int>myq ;
 int a[] = { 3,59,21,54,7 };
 for (int i = 0; i < 5; i++) {
 myq.push(a[i]);
 }
 myq.outPrint();// 打印队列
 myq.top();//弹出队首元素
 myq.pop();//打印队首元素
 myq.top();
 myq.getCount();//获取队列元素数量
 myq.top();
 myq.top();
 myq.outPrint();
 myq.top();
 myq.top();
 myq.pop();
  return 0;
}

MyQueue.h

#include <iostream>
using namespace std;
template<class T>
struct Node{
 T data;
 Node<T> * next;
};
template<class T>
class MyQueue{
private:
 Node<T>* head;//头指针
 int count;//队列元素数量
public:
 MyQueue();
 ~MyQueue();
 void outPrint();//打印队列元素
 void push(const T &e);//元素入队
 void top();// 返回队首元素
 void pop();//弹出队首元素
 int getCount();

};
template <class T>
MyQueue<T>::MyQueue(){
 count = 0;
 head = nullptr;
}

template <class T>
MyQueue<T>::~MyQueue(){
 if (head == nullptr) {
 cout << "已为空队列"<< endl;
 }
 else {
 Node<T> *temp;
 while (head!= nullptr) {
  temp = head;
  head = head->next;
  delete temp;
  count -= 1;
 }
 cout << "析构函数已完成"<< endl;
 cout << "队列元素个数为" << count << endl;
 }
}
template<class T>
int MyQueue<T>::getCount(){
 cout << "队列元素个数为: "<<count<< endl;
 return count;
}

template<class T>
void MyQueue<T>::push(const T&e) {//元素从链表头入队列
 if (e <=0) {
 cout << "请输入正数值" << endl;
 return;
 }
 if (count == 0) {
 Node<T>*node = new Node<T>;//此处留意,声明新节点,不使用new初始化会报错
 node->data = e;
 node->next = nullptr;
 head = node;

 }
 else {
 Node<T>* temp = head;
 for (int i = 0; i < count - 1;i++) {
  temp = temp->next;
 }
 Node<T>* node=new Node<T>;
 temp->next=node;
 node->data = e;
 node->next = nullptr;
 }
 count++;//队列元素数量加1
}
template <class T>
void MyQueue<T>::outPrint() {
 if (head == nullptr) {
 cout << "空队列" << endl;
 }
 else {
 Node<T>* temp=head;
 cout << "队列元素为:";
 while (temp!=nullptr) {
  cout << temp->data<<" ";
  temp = temp->next;
 }
 cout << endl;

 }
}
template <class T>
void MyQueue<T>::top() {
 if (head == nullptr) {
 cout << "这是空队列,无队首元素。"<< endl;
 }
 else {
 Node<T>* temp;
 temp = head;
 head = head->next;
 cout << "弹出队首元素:" <<temp->data<< endl;
 delete temp;
 count -= 1;
 }
}

template <class T>
void MyQueue<T>::pop() {
 if (head == nullptr) {
 cout << "此为空队列,无队首元素。" << endl;
 return;
 }
 else {
 cout << "队首元素为:" << head->data << endl;
 }
}

运行结果:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C++基础学习之函数重载的简单介绍

    前言 我们在平时写代码中会用到几个函数但是他们的实现功能相同,但是有些细节却不同.例如:交换两个数的值其中包括(int, float,char,double)这些个类型.在C语言中我们是利用不同的函数名来加以区分. void Swap1(int* a, int* b); void Swap2(float* a, float* b); void Swap3(char* a, char* b); void Swap4(double* a, double* b); 我们可以看出这样的代码不美观而且给程

  • C++小知识:不要节约代码行数

    本篇案例来自 KDE4 源码. 错误代码: void LDAPProtocol::del( const KUrl &_url, bool ) { .... if ( (id = mOp.del( usrc.dn() ) == -1) ) { LDAPErr(); return; } ret = mOp.waitForResult( id, -1 ); .... } 说明: 一些程序员竭尽全力想把更多的代码压缩到一行.他们尤其热衷于"if"条件语句,把赋值和比较一次性完成. 一个

  • C++深入学习之彻底理清重载函数匹配

    前言 前面我们讲到了<函数重载>,有了函数重载之后,就需要确定某次调用需要选用哪个函数.这个过程可以称之为函数匹配或者重载确定.大多数情况下,我们都很容易能够确定某次调用需要选用哪个函数,但事实上不尽然.但通过本文将彻底理清重载函数匹配 匹配过程 为便于说明,将函数匹配分为三个阶段,确定候选函数,确定可行函数,确定最佳匹配函数. 确定候选函数 候选函数也就是和被调用的函数同名,并且其声明在调用点可见.举个简单的例子. 假设有两个文件,1.cpp和2.cpp,内容分别如下: 1.cpp: //函

  • C++小知识:用合适的工具来分析你的代码

    静态代码分析工具可简化编码过程,检测出错误并帮助修复.有个国外团队检测了 200 多个 C/C++ 开源项目,包括了 Php.Qt 和 Linux 内核等知名项目.于是他们每天分享一个错误案例,并给出相应建议.今天的案例来自 LibreOffice 项目. 错误代码 BOOL WINAPI DllMain( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved ) { .... CreateThread( NULL, 0, ParentM

  • C++小知识:用++i替代i++

    静态代码分析工具可简化编码过程,检测出错误并帮助修复.PVS-Studio 是一个用于 C/C++ 的静态代码分析工具.该团队检测了 200 多个 C/C++ 开源项目,包括了 Unreal Engine.Php.Haiku.Qt 和 Linux 内核等知名项目.于是他们每天分享一个错误案例,并给出相应建议. 这个 bug 是在 Unreal Engine 4 的源代码中发现的. 错误代码: void FSlateNotificationManager::GetWindows( TArray<

  • C++小知识:复制粘贴代码千万要小心

    错误代码: sampleCount VoiceKey::OnBackward (....) { ... int atrend = sgn(buffer[samplesleft - 2]- buffer[samplesleft - 1]); int ztrend = sgn(buffer[samplesleft - WindowSizeInt-2]- buffer[samplesleft - WindowSizeInt-2]); ... } 解释: "buffer[samplesleft – Wi

  • C++小知识:C/C++中不要按值传递数组

    错误的代码: ID_INLINE mat3_t::mat3_t( float src[ 3 ][ 3 ] ) { memcpy( mat, src, sizeof( src ) ); } 说明: 有时候程序员会忘记 C/C++ 里数组不能按值传递给函数.当你试图这样做时,是数组的指针(第一个元素的地址)而不是整个数组被传递.我们还应该记住,方括号中的数字没有任何意义.它们仅仅是程序员所做的标志,记录了传递数组的『假定』大小.事实上,你也可以传递一个大小完全不同的数组.例如,下面的代码就会成功编译

  • C++小知识:大于0并不意味着等于1

    注:本文所指出的错误例子其实非常简单,任何 C++ 的初学者都能看懂.但是这个错误也非常典型,估计很多非常严肃的代码里面都存在这样的错误. 这个 Bug 是来自于 CoreCLR 源代码. 错误代码: bool operator( )(const GUID& _Key1, const GUID& _Key2) const { return memcmp(&_Key1, &_Key2, sizeof(GUID)) == -1; } 解释: 你不能将 memcpy().strc

  • C/C++语言printf命令使用方法

    在C语言以及其它语言中我们经常看到printf命令,那么怎么使用该命令输出想要的结果呢?下面就为大家演示. 1.printf()函数是一个格式化输出函数, 用户可以通过该命令向标准输出设备输出指定的格式信息.使用的方法是: printf("格式化字符串", 变量).在使用前需要注意的是该命令被定义在stdio.h头文件中(C语言),所以需要在程序中加入#include<stdio.h>.printf()函数是一个格式化输出函数, 用户可以通过该命令向标准输出设备输出指定的格

  • C++小知识:不要去做编译器的工作

    对于C++编程的老鸟来说,有时候他们喜欢把一些东西按照编译器的工作原理进行改写,以便提高代码的运行效率.这么做确实高明,也能体现出程序员的水平,但是这么做也是有风险的.因为有时候你可能会因为一些简单的笔误,而造成非常难以察觉的错误.本文就给出了类似的例子. 这个Bug 出现在MySQL源代码中. 错误代码: static int rr_cmp(uchar *a,uchar *b) { if (a[0] != b[0]) return (int) a[0] - (int) b[0]; if (a[

随机推荐