文档章节

简单的stack实现.

SHIHUAMarryMe
 SHIHUAMarryMe
发布于 2016/05/06 16:42
字数 389
阅读 24
收藏 0
 #include <iostream>
#include <stdexpect>
#include <memory>
template<typename T>
class Node{
 public:
  T data; //节点内存储的数据. 
  Node<T>* next; //指向下一个节点. 
  
  template<typename Ty>
  Node(const Ty& data_, Node<T>* n=nullptr);
  
  ~Node()=default;
};
template<typename T>
template<typename Ty>
Node<T>::Node(const Ty& data_, Node<T>* n)
        :data(data_)
         next(n)
{
 //
}
template<typename T>
class AStack{ //先进后出. 
 private:
  unsigned int maxSize; //该stack最多能够容纳多少个数据. 
  Node<T>* top;         //指向顶部数据的指针. 
  Node<T>* rear;        //指向尾部数据的指针. 
  unsigned int counter; //计数,当前stack中有多少个元素. 
  
  void clear(Node<T>* root)noexcept; //清理该stack中的数据. 
  
  public:
   template<typename Ty, typename = std::enable_if< std::is_unsigned<Ty>::value>::type>
   AStack(const Ty& size);
   
   ~AStack();
   
   template<typename Ty>
   void push(const Ty& value);
   const Node<T>& top()const noexcept;
   void pop()noexcept;
   void clear()noexcept;
};
template<typename T>
template<typename Ty, typename>
AStack<T>::AStack(const Ty& size)
          :maxSize(size), //size 
           top(nullptr),  //默认为空。 
           rear(nullptr),
           counter(0)
{
 //
}
template<typename T>
AStack<T>::~AStack()
{
 this->clear();
}
template<typename T>
void AStack<T>::clear(Node<T>* ptr)noexcept
{
 if(ptr == nullptr){
  return;
 }
 
 if(ptr != nullptr){
  this->clear(ptr->next);
 }
 
 delete ptr;
 ptr = nullptr;
}
template<typename T>
const Node<T>& AStack<T>::top()const noexcept //返回当前stack中的第一个数据. 
{
 return (this->rear)->data;
}
template<typename T>
void AStack<T>::pop()noexcept //删除当前stack中第一个数据. 
{
 Node<T>* headNext = (this->head)->next;
 delete this->head;
 this->head = headNext;
 headNext = nullptr;
}
template<typename T>
void AStack<T>::push(const Ty& value) //压入一条数据进去stack. 
{
 if(this->head == nullptr){
  ++(this->counter);          //this->counter = 1;
  this->head = new Node<Ty>(value);
  this->rear = (this->head)->next;
  
 }else{
  if(this->counter <= this->maxSize)
  {
   this->rear = new Node<Ty>(value);
   this->rear = (this->rear)->next;
  }else{
   throw std::runtime_error("Can not bigger than the maxSize!");
  }
 }
}
template<typename T>
void AStack<T>::clear()noexcept
{
 this->clear(this->head);
}

© 著作权归作者所有

共有 人打赏支持
SHIHUAMarryMe
粉丝 12
博文 162
码字总数 136638
作品 0
武汉
程序员
Java提高篇(三一)—–Stack

在Java中Stack类表示后进先出(LIFO)的对象堆栈。栈是一种非常常见的数据结构,它采用典型的先进后出的操作方式完成的。每一个栈都包含一个栈顶,每次出栈是将栈顶的数据取出,如下: Stac...

6pker
2016/10/24
55
0
Java集合Stack源码深入解析

概要 学完Vector了之后,接下来我们开始学习Stack。Stack很简单,它继承于Vector。学习方式还是和之前一样,先对Stack有个整体认识,然后再学习它的源码;最后再通过实例来学会使用它。 第1...

sihailoveyan
05/17
0
0
浅谈算法和数据结构: 一 栈和队列

     本文作者:yangecnu   http://www.cnblogs.com/yangecnu   最近晚上在家里看Algorithems,4th Edition,我买的英文版,觉得这本书写的比较浅显易懂,而且“图码并茂”,趁着这次...

深度学习
05/05
0
0
剑指Offer学习总结-用两个栈实现队列

剑指Offer学习总结-用两个栈实现队列 本系列为剑指Offer学习总结,主要是代码案例的分析和实现: 书籍链接:http://product.dangdang.com/24242724.html 原作者博客:http://zhedahht.blog....

wwlcsdn000
01/16
0
0
Netty精粹之轻量级内存池技术实现原理与应用

在Netty中,通常会有多个IO线程独立工作,基于NioEventLoop的实现,每个IO线程负责轮询单独的Selector实例来检索IO事件,当IO事件来临的时候,IO线程开始处理IO事件。最常见的IO事件即读写事...

Float_Luuu
2016/02/12
3.8K
9

没有更多内容

加载失败,请刷新页面

加载更多

js 操作cookie

var cookie = {// 设置cookie方法set:function(key,val,time){// 获取当前时间var date = new Date();// 将date设置为n天以后的时间var expiresDays = time;// 格...

小丶二
7分钟前
0
0
限制root远程登录 su和sudo命令

9月21日任务 3.7 su命令 3.8 sudo命令 3.9 限制root远程登录 对于Linux而言,权限的重要性毋庸置疑!对于普通用户而言无法执行那些只有root用户才能有效的命令,导致工作无法有效进行; 系统...

robertt15
9分钟前
0
0
MQTT协议的初浅认识之通讯级别和持久会话

背景 这是我最近了解MQTT协议的最后一部分内容了,MQTT协议里面的QOS和Keep Alive是两个比较重要的内容。QOS的设置,直接影响了订阅客户端与中间件之间的消息交互行为。而Keep Alive直接影响...

亚林瓜子
11分钟前
1
0
calc

width: calc(100% - 30px); 特别注意:减号左右空格,均不能去掉。 width: calc(100% - 30px);

柴高八斗之父
19分钟前
0
0
Spring Cloud Gateway全局过滤器GlobalFilter:返回消息和重定向

Spring Cloud Gateway的全局过滤器GlobalFilter,顾名思义,声明后会对所有的请求生效,可以用来做权限控制,这里简单记录一下拦截到非法请求后如何返回自定义信息和将请求重定向到指定URL。...

夜雨寄北09
22分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部