当前位置: 首页 > news >正文

C++用数组和链表分别实现Queue

C++用数组和链表分别实现Queue

昨天写了《C++用数组和链表分别实现Stack》,今天就是《C++用数组和链表分别实现Queue》,

队列就是先来的先被处理掉,后来的就等,直到成为先来的,实现起来感觉和栈差不多。

模板好用的,功能强大,有些东东还是写成模板的好,废话昨天都说了,今天是不想说的,

博客园的哥们说我的博客不符合推荐到首页的要求,只好加几句废话。

ContractedBlock.gif ExpandedBlockStart.gif 链表版
template < typename T,typename container >
class queue
{
public :
bool empty() const
{
return len == 0 ;
}

void checkEmpty()
{
if (empty())
{
throw new exception( " 队列中没有数据 " );
}
}

T
& back()
{
checkEmpty();
return cur -> val;
}

const T & back() const
{
return back();
}

void pop()
{
checkEmpty();
if (head -> next == cur)
{
delete head
-> next;
head
-> next = NULL;
}
else
{
node
* tmp = head -> next;
head
-> next = tmp -> next;
delete tmp;
}
-- len;
}

T
& front()
{
checkEmpty();
return head -> next -> val;
}

const T & front() const
{
return front();
}

void push( const T & val)
{
node
* tmp = new node(val);
cur
-> next = tmp;
cur
= tmp;
++ len;
}

queue()
{
initialize();
}

explicit queue( const container & cont)
{
initialize();
vector
< int > ::const_iterator iter = cont.begin();
while (iter != cont.end())
{
push(
* iter ++ );
}
}

~ queue()
{
node
* tmp;
while (tmp != NULL)
{
tmp
= head;
head
= head -> next;
delete tmp;
tmp
= NULL;
}
delete cur;
}


int size()
{
return len;
}

protected :
typedef
struct node1
{
node1
* next;
T val;
node1(T v):val(v),next(NULL){}
}node;

private :
int len;
node
* head;
node
* cur;
void initialize()
{
head
= new node( - 1 );
cur
= head;
len
= 0 ;
}
};
ContractedBlock.gif ExpandedBlockStart.gif 数组版

template
< typename T,typename container >
class queue
{
public :
bool empty() const
{
return head == rail;
}

void checkEmpty()
{
if (empty())
{
throw new exception( " 队列中没有数据 " );
}
}

// 队尾元素
T & back()
{
checkEmpty();
return arr[rail - 1 ];
}

const T & back() const
{
return back();
}

// 出队
void pop()
{
checkEmpty();
arr[head
++ ] = 0 ;
}

// 队头元素
T & front()
{
checkEmpty();
return arr[head];
}

const T & front() const
{
return front();
}

// 入队
void push( const T & val)
{
if (rail >= capacity){
capacity
= (rail - head) * 2 ;
T
* tmp = new T[capacity];
int j = 0 ;
for ( int i = head;i < rail;i ++ )
{
tmp[j
++ ] = arr[i];
}
delete arr;
arr
= tmp;
rail
= rail - head;
head
= 0 ;
}
arr[rail
++ ] = val;
}

queue()
{
initialize(
4 );
}

queue(
int capacity)
{
initialize(capacity);
}

explicit queue( const container & cont)
{
initialize(cont.size());
vector
< int > ::const_iterator iter = cont.begin();
while (iter != cont.end())
{
push(
* iter ++ );
}
}

~ queue()
{
delete arr;
}

// 队列中元素个数
int size()
{
return rail - head;
}

protected :
typedef
struct node1
{
node1
* next;
T val;
node1(T v):val(v),next(NULL){}
}node;

private :
int capacity;
int head; // 对头元素的位置
int rail; // 对尾元素的位置
int * arr;

void initialize( int cap)
{
capacity
= cap;
arr
= new int [capacity];
head
= rail = 0 ;
}
};



作者:陈太汉

相关文章:

  • Symfony2博客应用程序教程:第四部分(续)-测试安全页
  • 用vs2008打framework2.0的包
  • 网页的学习语言将仿佛使你生活更动人
  • 四级词汇(俞敏洪)-词根与词缀(二)
  • zBrow发布倒计时:对不起,让大家久等了
  • 常用公用用例设计-分页
  • JProfiler7发布,支持JDBC数据显示
  • 我在上海IT运维的日子
  • 【转】 cin、cin.get()、cin.getline()、getline()、gets()等函数的用法
  • 老菜鸟苦战oracle asm
  • android的各种*.img 文件
  • HyperSnap 6捕获的视频图片都是一片漆黑
  • GDI+ 绘制自定义制表位位数的文本。
  • 数据结构~链表
  • ComboBox控件数据绑定
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • Java 网络编程(2):UDP 的使用
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • Laravel 中的一个后期静态绑定
  • Leetcode 27 Remove Element
  • Spring声明式事务管理之一:五大属性分析
  • 给Prometheus造假数据的方法
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 前端自动化解决方案
  • 数据结构java版之冒泡排序及优化
  • 算法之不定期更新(一)(2018-04-12)
  • 探索 JS 中的模块化
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • ​Java并发新构件之Exchanger
  • # 计算机视觉入门
  • #1015 : KMP算法
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (二)构建dubbo分布式平台-平台功能导图
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (一)RocketMQ初步认识
  • (译)2019年前端性能优化清单 — 下篇
  • (转)EXC_BREAKPOINT僵尸错误
  • (转)http协议
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET/C# 使窗口永不激活(No Activate 永不获得焦点)
  • .NET/C# 中设置当发生某个特定异常时进入断点(不借助 Visual Studio 的纯代码实现)
  • .pub是什么文件_Rust 模块和文件 - 「译」
  • /var/spool/postfix/maildrop 下有大量文件
  • @Autowired自动装配
  • [2009][note]构成理想导体超材料的有源THz欺骗表面等离子激元开关——
  • [ANT] 项目中应用ANT
  • [Apio2012]dispatching 左偏树
  • [codevs 1288] 埃及分数 [IDdfs 迭代加深搜索 ]