#include <iostream>
#include <cstdlib>

template<class T>
void changeLength1D(T*& a, int oldLength, int newLength) {
  if(newLength<0) {
    std::cout<<"new length must be >=0\n";
    exit(-1);
  }

  T* temp=new T[newLength];
  int number=std::min(oldLength,newLength);
  std::copy(a,a+number,temp);
  delete [] a;
  a=temp;
}

template<class T>
class stack {
public:
  virtual ~stack() {}
  virtual bool empty() const=0;
  virtual int size() const=0;
  virtual T& top()=0;
  virtual void pop()=0;
  virtual void push(const T& theElement)=0;
};

template<class T>
class arrayStack:public stack<T> {
public:
  arrayStack(int initialCapacity=10);
  ~arrayStack() {delete [] stack;}
  bool empty() const {return stackTop==-1;}
  int size() const {return stackTop + 1;}
  T& top() {
    if(stackTop==-1) {
      std::cout<<"stack is empty\n";
      exit(-1);
    }
    return stack[stackTop];
  }
  void pop() {
    if(stackTop == -1) {
      std::cout<<"stack is empty\n";
      exit(-1);
    }
    stack[stackTop--].~T();
  }
  void push(const T& theElement);

private:
  int stackTop;
  int arrayLength;
  T* stack;
};

template<class T>
arrayStack<T>::arrayStack(int initialCapacity) {
  if(initialCapacity < 1) {
    std::cout<<"Must be > 0.\n";
    exit(-1);
  }
  arrayLength=initialCapacity;
  stack=new T[arrayLength];
  stackTop=-1;
}

template<class T>
void arrayStack<T>::push(const T& theElement) {
  if(stackTop == arrayLength-1) {
    changeLength1D(stack, arrayLength, 2*arrayLength);
    arrayLength *= 2;
  }
  stack[++stackTop] = theElement;
}

int main() {
  arrayStack<int> my_stack(20);

  for(size_t i=0; i<10; i++) {
    my_stack.push(i);
  }

  for(;;) {
    if(my_stack.empty())
      break;
    std::cout<<my_stack.top()<<" ";
    my_stack.pop();
  }
  std::cout<<"\n";

  return 0;
}

数据结构C++,栈的实现的更多相关文章

  1. 学习javascript数据结构(一)——栈和队列

    前言 只要你不计较得失,人生还有什么不能想法子克服的. 原文地址:学习javascript数据结构(一)--栈和队列 博主博客地址:Damonare的个人博客 几乎所有的编程语言都原生支持数组类型,因 ...

  2. 基础数据结构 之 栈(python实现)

    栈是编程开发中的两种较为简单的数据结构.栈和队可用于模拟函数的递归.栈的特点是后进先出.其常用操作包括:出栈,入栈等.在出栈前,需判断栈是否为空.在入栈时,需判断栈是否已满. 下面给出一个用pytho ...

  3. PHP数据结构:栈、队列、堆、固定数组

    数据结构:栈 队列: 堆: 固定尺寸的数组:

  4. python数据结构之栈与队列

    python数据结构之栈与队列 用list实现堆栈stack 堆栈:后进先出 如何进?用append 如何出?用pop() >>> >>> stack = [3, ...

  5. 不使用数据结构反转栈 递归 CVTE实习 CVTE是一家什么公司

    本文因为垃圾csdn标题字限制,标题写不好.本文想说一个算法,和我在CVTE的实习,我看到CVTE是一家什么公司.如果想要喷我的,可以留言,我不会理.如果想喷公司,可以在博客评论或发到我邮件linde ...

  6. Python数据结构之栈的实现

    一图胜千言,看图! 代码code: #coding:utf-8 #常见数据结构之栈的实现 class Stack(): #创建Stack类 def __init__(st,size): st.stac ...

  7. 数据结构之 栈 (Python 版)

    数据结构之 栈 (Python 版) -- 利用线性表实现栈 栈的特性: 后进先出 基于顺序表实现栈 class SStack(): ''' 基于顺序表 实现的 栈类 ''' def __init__ ...

  8. hdu 1022:Train Problem I(数据结构,栈,递归,dfs)

    Train Problem I Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  9. 数据结构(栈&堆 )

    在计算机领域,堆栈是一个不容忽视的概念,堆栈是两种数据结构.堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除.在单片机应用中,堆栈是个特殊的存储区,主要功能 ...

  10. Lua虚拟机中的数据结构与栈

    Lua虚拟机中的数据结构与栈 来源 https://blog.csdn.net/zry112233/article/details/80828327 由上一篇文章可知解释器分析Lua文件之后生成Pro ...

随机推荐

  1. ZipMarket数字内容/素材交易网站源码项目

    ZipMarket程序仿自Envato旗下网站,对于想创建数字内容/素材交易平台的站长来说,ZipMarket是一个十分独特和极具创新的解决方案,用户在你的网站注册并购买或出售数字内容/素材作品时,你 ...

  2. Lazarus 1.6 增加了新的窗体编辑器——Sparta_DockedFormEditor.ipk

    一下是该控件官网的介绍 "Hello A package for a docked form editor can be found in : components/sparta/docke ...

  3. mongodb分片集群安装教程

    mongodb 集群包含副本集群,主从集群以及分片集群,分片集群比较复杂,这里测试我采用了三台机器,交差部署 blog地址:http://www.cnblogs.com/caoguo 一 .环境:#m ...

  4. Josephus problem(约瑟夫问题,丢手绢问题)

    约瑟夫问题 约瑟夫环问题是一个数学应用题:已知n个人(以编号1,2,3.....,n)围坐在一张圆桌的周围.从编号为k的人开始报数,数到m的那个人出列:他的下一个人又从1开始报数,数到m的那个人又出列 ...

  5. 常见的CPU指令集介绍

    本文摘自网络   一.X86 是微处理器执行的计算机语言指令集,指一个intel通用计算机系列的标准编号缩写,也标识一套通用的计算机指令集合,属于CISC. 1.1.简介 X86指令集是美国Intel ...

  6. css的基础知识1

    总结:css引用:1内联:在标签中加style属性,<标签名 style="样式1:样式值1:样式2:样式值2"> </标签名>.2.内嵌:在head标签中 ...

  7. 模态框(layer)

    推荐一个好看的模态框(layer)   地址:http://layer.layui.com/ 相应列子及配置  全部来自于官网,可直接访问官网学习了解. //信息框-例1 layer.alert('见 ...

  8. Django - orm外键操作

    1.orm外键操作 创建外键: 备注:ForeignKey两个参数,1个为关联的表名,1个为关联的字段名: 在django2.0后,定义外键和一对一关系的时候需要加on_delete选项,此参数为了避 ...

  9. 求n!(高精度问题)

    #include <iostream> #include <stdio.h> #define MAX 10000 using namespace std; void Mul(i ...

  10. Spring Web MVC处理流程

    Spring Web MVC 处理流程: 1.浏览器向Spring发出请求,请求交给前端控制器 DispatcherServlet处理 2.控制器通过HandlerMapping找到相应的Contro ...