#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. git使用原理

    如果需要新建仓库: mkdir new_artcle//artcle为文件名 cd new_artcle//进入该目录 git init //初始化工作空间 git add 文件名(article) ...

  2. RTL Compiler之Example

    Synthesis = Translation +  Logic Optimization + Mapping Step 1 Source files 1) make directory mkdir ...

  3. dva相关文档

    https://dvajs.com/guide/getting-started.html#%E5%AE%9A%E4%B9%89-model-------dva.js https://dvajs.com ...

  4. react特性-声明式编程

    网络上有很多关于声明式编程和命令式编程的对比和说明,但是大多都是大同小异,总的来说就是一句话"告诉电脑我要做什么,但是让电脑自己决定怎么做." 1.命令式编程. 这种编程模式比较常 ...

  5. 换个语言学一下 Golang (4)——变量与常量

    一.变量定义 所谓的变量就是一个拥有指定名称和类型的数据存储位置. //看一个例子 package main import ( "fmt" ) func main() { var ...

  6. https webservice通讯 参考网址 http://blog.csdn.net/small____fish/article/details/8214938

    一.生成密钥库和证书可参考以下密钥生成脚本,根据实际情况做必要的修改,其中需要注意的是:服务端的密钥库参数“CN”必须与服务端的IP地址相同,否则会报错,客户端的任意. 1.生成服务器证书库keyto ...

  7. 293. [NOI2000] 单词查找树——COGS

    293. [NOI2000] 单词查找树 ★★   输入文件:trie.in   输出文件:trie.out   简单对比时间限制:1 s   内存限制:128 MB 在进行文法分析的时候,通常需要检 ...

  8. jQuery练习:表单模态框

    代码:基于事件冒泡原理和事件委托 <!DOCTYPE html> <html lang="zh-cn"> <head> <meta cha ...

  9. 64.root object的理解

    一.root object的理解     就是某个type对应的mapping json,包括properties,metadata(_id,_source,_type),settings(analy ...

  10. vs2015 配置 cplex

    首先设置模式为Release, 根据软件选择x86或x64 附加库目录(链接器 - 常规) C:\Program Files\IBM\ILOG\CPLEX_Studio128\cplex\lib\x6 ...