<泛> STL - stack 模拟实现
今天,看C++Template的时候看到那人写了一个Stack,于是乎,手痒,自己也写了一个,在拜读了STD文件和C++模板元编程某些小节之后,你们就看到了这篇代码。
经过上述一番经历之后,我重新写了myVector,使之更完善,更加服务于顶层结构,如:myStack
栈没什么写的,大部分精力都放在了重新构建底层容器上,STL里面的功能函数基本都实现了,除了std的各种相关的构造函数实在整不来那么多
测试效果:
#include "E:\数据结构\myStack.h"
#include <iostream> using namespace std; int main(int argc, char* argv[])
{
int arr[]{ ,,,,,, };
myVector<int> V{ arr,arr + };
myStack<int> S;
myStack<int>S2{ V }; cout << "test 1" << endl << endl;
cout << "栈1添加一个元素 10" << endl << endl;
S.push();
cout << "栈1添加一个元素 15" << endl << endl;
S.push();
cout << "栈1顶部元素为:";
cout << S.top() << endl << endl;
S.pop();
cout << "弹出栈1顶部元素" << endl << endl;
cout << "栈1顶部元素为:";
cout << S.top() << endl << endl;
S.pop();
cout << "弹出栈1顶部元素" << endl << endl;
cout << "栈1添加元素 10、15" << endl << endl;
S.push();
S.push(); cout << "交换栈1栈2" << endl << endl;
S.swap(S2); cout << "test 2" << endl << endl; cout << "栈1:" << endl;
myStack<int>::container_type container = S._Get_container();
for (auto it : container)
cout << it << " ";
cout << endl << endl; cout << "栈2:" << endl;
myStack<int>::container_type container2 = S2._Get_container();
for (auto it : container2)
cout << it << " ";
cout << endl;
}
Template代码:
#ifndef _MY_STACK
#define _MY_STACK #include <E:\数据结构\myVector.h>
template<class T,
class myContainer = myVector<T> >
class myStack
{
public: //public date-type information used by class design
typedef myStack<T, myContainer> _Mytype;
typedef myContainer container_type;
typedef typename myContainer::value_type value_type;
typedef typename myContainer::size_type size_type;
typedef typename myContainer::_pointer _pointer; #define self (*this) public: //basic functions of class myStack()
{
elems.clear();
} myStack(const _Mytype& rhs)
:elems(rhs.elems)
{ } explicit myStack(const myContainer& _container)
:elems(_container)
{ } _Mytype& operator=(const _Mytype& other)
{
elems = other.elems;
return self;
} public: //some operator-loading functions of stack
bool operator==(const _Mytype& rhs)
{
return elems == rhs.elems;
} bool operator!=(const _Mytype& rhs)
{
return elems != rhs.elems;
} bool operator<(const _Mytype& rhs)
{
return elems < rhs.elems;
} bool operator>(const _Mytype& rhs)
{
return elems > rhs.elems;
} bool operator<=(const _Mytype& rhs)
{
return !(self > rhs);
} bool operator>=(const _Mytype& rhs)
{
return !(self < rhs);
} public: // main options of stack void push(T const& item)
{ //尾部添加元素
elems.push_back(item);
} void pop()
{ //将顶部元素删除
if (elems.empty())
throw "myStack<>::pop(): empty stack\n";
elems.pop_back();
} const T& top()const
{ //取顶部元素
if (elems.empty())
throw "myStack<>::top(): empty stack\n";
return elems.back();
} bool empty()const
{ //判空
return elems.empty();
} void swap(_Mytype& rhs)
{ //交换数据
elems.swap(rhs.elems);
} size_type size()const
{ //get the size of stack
return elems.size();
} const myContainer& _Get_container()const
{ //Get the container of stack
return elems;
} private:
myContainer elems; }; #endif
感谢您的阅读,生活愉快~
<泛> STL - stack 模拟实现的更多相关文章
- 洛谷 P1739 表达式括号匹配【STL/stack/模拟】
题目描述 假设一个表达式有英文字母(小写).运算符(+,-,*,/)和左右小(圆)括号构成,以"@"作为表达式的结束符.请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则返 ...
- <泛> STL - vector 模拟实现
今天为大家带来一个模拟STL-vector的模板实现代码. 首先看一下测试结果,之后再为大家呈现设计 测试效果 测试代码 #include<iostream> #include<ve ...
- STL stack 容器
STL stack 容器 Stack简介 stack是堆栈容器,是一种“先进后出”的容器. stack是简单地装饰deque容器而成为另外的一种容器. #include <s ...
- 浅谈C++ STL stack 容器
浅谈C++ STL stack 容器 本篇随笔简单介绍一下\(C++STL\)中\(stack\)容器的使用方法和常见的使用技巧. stack容器的概念 \(stack\)在英文中是栈的意思.栈是一种 ...
- C++ 标准模板库(STL)-stack
主要介绍一下C++11版本中标准模板库中栈的用法,希望可以帮到需要用的人. #include <iostream> #include <stack> #include < ...
- STL stack 常见用法详解
<算法笔记>学习笔记 stack 常见用法详解 stack翻译为栈,是STL中实现的一个后进先出的容器.' 1.stack的定义 //要使用stack,应先添加头文件#include &l ...
- C++ STL stack和queue
C++ STL中独立的序列式容器只有vector,list,deque三种,stack和queue其实就是使用容器适配器对deque进行了封装,使用了新接口. 使用标准库的栈和队列时,先包含相关的头文 ...
- C++ STL stack 用法
Stack(栈)是一种后进先出的数据结构,也就是LIFO(last in first out) ,最后加入栈的元素将最先被取出来,在栈的同一端进行数据的插入与取出,这一段叫做“栈顶”. 使用STL的s ...
- STL——stack
首先,堆栈是一个线性表,插入和删除只在表的一端进行.这一端称为栈顶(Stack Top),另一端则为栈底(Stack Bottom).堆栈的元素插入称为入栈,元素的删除称为出栈.由于元素的入栈和出栈总 ...
随机推荐
- SVN 使用笔记
SVN中检出 和 导出 的区别 检出得到的文件夹中,是受SVN客户端控制的,对其进行文件或文件夹的增删改操作都会被SVN客户端识别出来,对其可以进行update.commit操作.其中含有.svn隐藏 ...
- RGB, YUV及相关标准
最近在一次排查问题的过程中发现色彩空间及色彩空间转换也有很多技术细节,而理清这些细节能帮助我们更准确的定位视频方面的问题. 1. 色彩空间 色彩空间一词源于英文的“Color Space”,色彩学中, ...
- Android笔记之广播
为了容易理解,可以将广播代入到事件模型中,发送广播消息看做是触发event,BroadcastReceiver是处理事件的回调逻辑. 广播这种模型中涉及到两个角色,就是广播的发送者和接收者,所以会涉及 ...
- 20165230 《Java程序设计》实验三 敏捷开发与XP实践 实验报告
20165230 <Java程序设计>实验三 敏捷开发与XP实践 实验报告 一.实验报告封面 课程:Java程序设计 班级:1652班 姓名:田坤烨 学号:20165230 成绩: 指导教 ...
- DevExpress 行事历(Scheduler)的常用属性、事件和方法
一.TcxScheduler[TcxScheduler常用属性]1.Storage - 邦定一个Storage为Scheduler显示提供数据 2.DateNavigate.ColCount ...
- ajax代码示例
function loadXMLDoc(idName,url,sendOut) { var xmlhttp; if (window.XMLHttpRequest) {// code for IE7+, ...
- Jenkins无法安装插件或首次安装插件界面提示Offline
一.首先点击系统管理 二.点击插件管理 三.选择高级管理 四.将升级站点中的https改成http即可
- 【Android开发】之Fragment开发1
一直知道Fragment很强大,但是一直都没有去学习,现在有些空闲的时间,所以就去学习了一下Fragment的简单入门.我也会把自己的学习过程写下来,如果有什么不足的地方希望大牛指正,共同进步! 一. ...
- Scala中的"null" 和“_”来初始化对象
Alternatives Use null as a last resort. As already mentioned, Option replaces most usages of null. I ...
- python网络编程--线程join和Daemon(守护进程)
一:什么情况下使用join join([timeout])调用join函数会使得主调线程阻塞,直到被调用线程运行结束或超时. 参数timeout是一个数值类型,用来表示超时时间,如果未提供该参数,那么 ...