【Weiss】【第03章】队列例程
前几个例程还是相当简单的,把链表即时改了一下就是队列了。
还有想了一下,决定这种例程的代码放法是:先把测试代码默认折叠放在前面,然后把实现代码默认展开放在后面。
测试代码如下:
#include <iostream>
#include "queue.h"
using namespace std;
using namespace queue;
template class Queue<int>;
int main(void)
{
Queue<int> number; //测试插入
cout << "/*additem()*/" << endl;
number.enqueue();
number.enqueue();
number.enqueue();
number.enqueue();
number.enqueue();
number.traverse();
cout << "\n/*end*/\n\n" << flush; //测试获取长度
cout << "/*length()*/" << endl;
cout << number.size() << endl;
cout << "/*end*/\n\n" << flush; //测试获得头元素
cout << "/*getfirst()*/" << endl;
cout << number.getfirst() << endl;
cout << "/*end*/\n\n" << flush; //测试获得尾元素
cout << "/*getfirst()*/" << endl;
cout << number.getlast() << endl;
cout << "/*end*/\n\n" << flush; //测试出队
cout << "/*remove()*/" << endl;
number.dequeue();
number.dequeue();
number.traverse();
cout << "\n/*end*/\n\n" << flush; //测试清空,并测试从空表中出队
cout << "/*clear(),remove()*/" << endl;
number.clear();
number.dequeue();
cout << "/*end*/\n\n" << flush; system("pause");
}
队列实现代码如下:
#ifndef QUEUE
#define QUEUE
#include <iostream>
using namespace std; namespace queue
{ //节点模板
template <typename T> struct Node
{
Node<T>() : next(nullptr){}
Node<T>(const T &item, Node<T>* ptr = nullptr) : data(item), next(ptr){}
T data;
Node<T>* next;
};
//头节点及主体操作
template <typename T> class Queue
{
//构造函数
public:
Queue<T>() : length(), front(nullptr), rear(nullptr){}
//接口
public:
//返回长度
unsigned int size()const{ return length; }
//返回头指针
Node<T>* begin()const{ return front; }
//判断是否为空
bool empty()const{ return length == ; }
//获得头元素
T getfirst()const{ return front->data; }
//获得尾元素
T getlast()const{ return rear->data; }
//#查找元素所在地址
Node<T>* find(const T &item)const;
//#入队,插入队尾
bool enqueue(const T &item);
//#出队,删除队首元素
bool dequeue();
//#遍历并输出队列元素
void traverse()const;
//#清空队列
void clear(); //辅助函数
private:
//#查找元素前驱
Node<T>* find_prev(const T& item)const;
//数据
private:
unsigned int length;
Node<T>* front;
Node<T>* rear;
}; //如果元素为头元素或元素不存在则返回nullptr,否则返回前驱
template <typename T> Node<T>* Queue<T>::find_prev(const T& item)const
{
if (length == )
return nullptr;
if (front->data == item)
return nullptr;
for (Node<T>* iter = front; iter->next != nullptr; iter = iter->next)
{
if (iter->next->data == item)
return iter;
}
return nullptr;
}
//调用find_prev,如果元素存在则返回地址,不存在则返回nullptr
template <typename T> Node<T>* Queue<T>::find(const T &item)const
{
Node<T>* iter = find_prev(item);
if (length == )
return nullptr;
if (front->data == item)
return front;
return iter->next;
}
template <typename T> bool Queue<T>::enqueue(const T &item)
{
Node<T>* pnew = new Node<T>(item);
if (length == )
front = rear = pnew;
else
{
rear->next = pnew;
rear = rear->next;
}
++length;
return true;
}
template <typename T> bool Queue<T>::dequeue()
{
if (length == )
{
cout << "No data!" << endl;
return false;
}
Node<T>* save = front;
front = front->next;
//如果出队后队列为空,则尾指针同时置空
if (length == )
rear = nullptr;
delete save;
--length;
return true;
}
template <typename T> void Queue<T>::traverse()const
{
if (length != )
{
for (Node<T>* iter = front; iter != nullptr; iter = iter->next)
cout << iter->data << ends;
}
}
template <typename T> void Queue<T>::clear()
{
Node<T>* iter;
while (front != nullptr)
{
iter = front;
front = front->next;
delete iter;
}
front = rear = nullptr;
length = ;
} }
#endif
【Weiss】【第03章】队列例程的更多相关文章
- 【Weiss】【第03章】练习3.25:数组模拟队列
[练习3.25] 编写实现队列的例程,使用 a.链表 b.数组 Answer: 在这章一开头就已经写了个链表的队列例程了,所以实际上只要做b小题就可以. 数组模拟队列和链表的两点小不同是: ①.数组空 ...
- 算法<初级> - 第二章 队列、栈、哈希表相关问题
算法 - 第二章 数据结构 题目一 用数组实现大小固定的队列和栈(一面题) 数组实现大小固定栈 /*** * size是对头索引(initSize是固定大小) 也是当前栈大小 * size=下个进队i ...
- 第03章 AOP前奏
第03章 AOP前奏 提出问题 ●情景:数学计算器 ●要求 ①执行加减乘除运算 ②日志:在程序执行期间追踪正在发生的活动 ③验证:希望计算器只能处理正数的运算 ●常规实现 ●问题 ○代码混乱:越来越多 ...
- 第03章_基本的SELECT语句
第03章_基本的SELECT语句 1. SQL概述 1.1 SQL背景知识 1946 年,世界上第一台电脑诞生,如今,借由这台电脑发展起来的互联网已经自成江湖.在这几十年里,无数的技术.产业在这片江湖 ...
- suse 12 二进制部署 Kubernetets 1.19.7 - 第03章 - 部署flannel插件
文章目录 1.3.部署flannel网络 1.3.0.下载flannel二进制文件 1.3.1.创建flannel证书和私钥 1.3.2.生成flannel证书和私钥 1.3.3.将pod网段写入et ...
- 【Weiss】【第03章】练习3.26:双端队列
[练习3.26] 双端队列(deque)是由一些项的表组成的数据结构,对该数据结构可以进行下列操作: Push(X,D):将项X插入到双端队列D的前端. Pop(D):从双端队列D中删除前端项并返回. ...
- 【Weiss】【第03章】链表例程的一些修改
主要是,感觉原来的链表例程通过Node的分配形成了链表,但是没有自动消除Node的办法比较危险,一旦在clear()之前把链表赋了其它值就内存泄漏了. 所以改了析构函数,自动清理分配出来的内存.既然改 ...
- 【Weiss】【第03章】链表例程
这种基础例程,如之前所提,会有一个实现和一个简单的测试代码. 链表其实没什么可说的,其实包括后面的栈和队列也没什么可说的,直接放代码吧. 下面这个是测试代码 #include <iostream ...
- 【Weiss】【第03章】栈例程
写栈比队列更简单一些,毕竟只有一个数据出入口. 之前用C在程序里模拟栈代替递归的时候,直接搞个数组来实现都是非常轻松愉快的事情. 不多说,放代码. 测试代码 #include <iostream ...
随机推荐
- 浅谈Java转义符\\|
看一段程序 String t = "a||b||c||d"; String[] temp = t.split("\\|\\|"); System.out.pri ...
- 将js进行到底:node学习6
开始真正的node web开发--express框架 为何说现在才是web开发的真正开始呢? 首先任何企业都不会用原生的http协议API去开发一个完整的网站,除非她们先开发一个框架出来,其次我们之前 ...
- github 下载部分代码
作者:知乎用户链接:https://www.zhihu.com/question/25369412/answer/96174755来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...
- Jennifer Chayes: 生活始终在你手中
Jennifer Chayes 听到Mark Kac.Freeman J. Dyson.林家翘,或者是David I. Gottlie.BerndSturmfels和Sir John Ball等 ...
- swift中的闭包总结
闭包是功能性自包含模块,可以在代码中被传递和使用. Swift 中的闭包与 Objective-C中的 blocks 以及其他一些编程语言中的 lambdas 比较相似. 闭包的基本语法 闭包表达式语 ...
- 5G时代,什么将会消失?
5G时代说着说着就来了,当然,它不可能一撮而就,但正如4G.移动互联网和WIFI这些东西基本上是日益精进的水平,现如今饭馆的生意是否火爆,不仅仅在于其菜品和服务的质量,更在于他们有没有WIFI以及 ...
- C++扬帆远航——18(项目五2,递归式)
/* * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:qiushi.cpp * 作者:常轩 * 微信公众号:World ...
- 热更新,App双开,App隐藏,App试用 -- Replugin的实际应用(原创)
热更新,App双开,App隐藏,App试用 -- Replugin的实际应用(原创) RePlugin是Qihoo 360公司的开源框架,原本目的是用于热更新.但是,这个框架提供的功能远远超出了热更新 ...
- python爬虫之浅析验证码
一.什么是验证码? 验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”( ...
- 什么是x86什么是x64 它们有什么区别
1.内存寻址不同: 32位系统,最大支持3.5G内存,如果在32位系统中使用4G或更大的内存,电脑最多只可以识别3.4G左右可用,而64位系统最大可以支持128G大内存. 2.运算速度不同: 64位系 ...