#include <iostream>
using namespace std; //栈结点类
template <typename T>
class stackNode{
private:
T data; //结点数据部分
stackNode<T> *next; //指向下一个结点
public:
//构造函数,初始化成员变量
stackNode(T d = 0 , stackNode<T> * n=NULL){
data = d;
next = n;
}
//设置成员变量data
void setData(T d){
data = d;
}
//设置成员变量next
void setNext(stackNode<T> * n){
next = n;
}
//返回成员变量data
T getData() const{
return data;
}
//返回成员变量next
stackNode<T> *getNext() const{
return next;
}
}; //栈类
template <typename T>
class stackList{
private:
stackNode<T> *top; //指向栈顶结点,也是链表的头指针
int num; //栈结点个数
public:
//构造函数
stackList(){
top=NULL;
num=0;
}
//析构函数,释放栈中所有结点,其实也就是释放整个链表
~stackList(){
while(top){
stackNode<T> * p = top;
top = top->getNext();
delete p;
}
}
//将结点x压入栈
void push(stackNode<T> & x);
//弹出栈顶结点
void pop();
//获得栈顶结点
stackNode<T> & getPeek()const;
//栈是否为空
bool isEmpty() const;
//返回栈中元素个数
int getNum() const{
return num;
}
//打印栈中元素
void printAll()const;
}; //将结点x压入栈,实现部分
template <typename T>
void stackList<T>::push(stackNode<T> & x){
stackNode<T> *p = top;
top = &x;
x.setNext(p);
num++;
} //弹出栈顶结点,实现部分
template <typename T>
void stackList<T>::pop(){
if(isEmpty()){
cerr<<"栈为空,弹出失败"<<endl;
exit(1);
}
stackNode<T> *p = top;
top=top->getNext();
delete p;
num--;
} //获得栈顶结点,实现部分
template <typename T>
stackNode<T> & stackList<T>::getPeek() const{
if(isEmpty()){
cerr<<"栈为空"<<endl;
exit(1);
}
return *top;
} //栈是否为空,实现部分
template <typename T>
bool stackList<T>::isEmpty() const{
return top==NULL;
} //打印栈中元素,实现部分
template <typename T>
void stackList<T>::printAll() const{
stackNode<T> *p = top;
while(p){
cout<<p->getData()<<endl;
p=p->getNext();
}
} void main(){
stackNode<int> *p1 = new stackNode<int>(1); //创建第一个结点,值为1
stackNode<int> *p2 = new stackNode<int>(2); //创建第一个结点,值为2
stackNode<int> *p3 = new stackNode<int>(3); //创建第一个结点,值为3
stackNode<int> *p4 = new stackNode<int>(4); //创建第一个结点,值为4
stackNode<int> *p5 = new stackNode<int>(5); //创建第一个结点,值为5
stackList<int> a; //创建栈
a.push(*p1); //压入第一个结点
a.push(*p2); //压入第二个结点
a.push(*p3); //压入第三个结点
a.push(*p4); //压入第四个结点
a.push(*p5); //压入第五个结点
a.pop(); //弹出栈顶元素
a.printAll(); //打印栈中元素
}

栈(链式存储) C++模板实现的更多相关文章

  1. 基于链式链表的栈链式存储的C风格实现

    链式链表的头文件与CPP文件见前文 头文件: #ifndef _LINKSTACK_H_ #define _LINKSTACK_H_ typedef void LinkStack; //创建一个栈 L ...

  2. C 栈 链式存储

    #ifndef _MY_LINKSTACK_H_ #define _MY_LINKSTACK_H_ typedef void LinkStack; LinkStack* LinkStack_Creat ...

  3. 栈的链式存储 - API实现

    基本概念 其它概念详情參看前一篇博文:栈的顺序存储 - 设计与实现 - API实现 这里也是运用了链表的链式存储API高速实现了栈的API. 代码: // linkstack.h // 链式存储栈的A ...

  4. C++编程练习(4)----“实现简单的栈的链式存储结构“

    如果栈的使用过程中元素数目变化不可预测,有时很小,有时很大,则最好使用链栈:反之,如果它的变化在可控范围内,使用顺序栈会好一些. 简单的栈的链式存储结构代码如下: /*LinkStack.h*/ #i ...

  5. 【Java】 大话数据结构(6) 栈的顺序与链式存储

    本文根据<大话数据结构>一书,实现了Java版的栈的顺序存储结构.两栈共享空间.栈的链式存储机构. 栈:限定仅在表尾进行插入和删除操作的线性表. 栈的插入(进栈)和删除(出栈)操作如下图所 ...

  6. 栈的顺序存储和链式存储c语言实现

    一. 栈 栈的定义:栈是只允许在一端进行插入或删除操作的线性表. 1.栈的顺序存储 栈顶指针:S.top,初始设为-1 栈顶元素:S.data[S.top] 进栈操作:栈不满时,栈顶指针先加1,再到栈 ...

  7. C语言- 基础数据结构和算法 - 栈的链式存储

    听黑马程序员教程<基础数据结构和算法 (C版本)>, 照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友 ...

  8. [置顶] ※数据结构※→☆线性表结构(queue)☆============优先队列 链式存储结构(queue priority list)(十二)

    优先队列(priority queue) 普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除.在优先队列中,元素被赋予优先级.当访问元素时,具有最高优先级的元素最先删除.优先队列具有 ...

  9. Java实现链式存储的二叉树

    二叉树的定义: 二叉树(BinaryTree)是n(n≥0)个结点的有限集,它或者是空集(n=0),或者由一个根结点及两棵互不相交的.分别称作这个根的左子树和右子树的二叉树组成. 二叉树的遍历方式主要 ...

  10. javascript实现数据结构:线性表--线性链表(链式存储结构)

    上一节中, 线性表的顺序存储结构的特点是逻辑关系上相邻的两个元素在物理位置上也相邻,因此可以随机存取表中任一元素,它的存储位置可用一个简单,直观的公式来表示.然后,另一方面来看,这个特点也造成这种存储 ...

随机推荐

  1. http://www.360doc.com/content/10/1012/09/3722251_60285817.shtml

    http://www.360doc.com/content/10/1012/09/3722251_60285817.shtml http://www.docin.com/p-163063250.htm ...

  2. 让DataGridView显示行号

          http://www.cnblogs.com/JuneZhang/archive/2011/11/21/2257630.html 为了表示行号,我们可以在DataGridView的RowP ...

  3. zookeeper配置同步zookeeper编程

    分布式助手Zookeeper(四) kissyoudyb 2013-12-05 17:41 阅读:33 评论:0     分布式助手Zookeeper(三) kissyoudyb 2013-12-05 ...

  4. android学习日记23--Android XML解析

    一.简述 XML语言是跨平台,JAVA对XML语言支持得比较好,android系统的应用层平台是JAVA做的,所以用XML.XML解析比较简单.XML解析就是将获取到的数据分离出来,基本的网络数据传输 ...

  5. Linux中的文件描述符与打开文件之间的关系------------每天进步一点点系列

    http://blog.csdn.net/cywosp/article/details/38965239 1. 概述     在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件.目录文件. ...

  6. Distributed locks with Redis--官方

    原文:http://redis.io/topics/distlock Distributed locks with Redis Distributed locks are a very useful ...

  7. eclipse git插件配置

    一.Eclipse上安装GIT插件EGit Eclipse的版本eclipse-java-helios-SR2-win32.zip(在Eclipse3.3版本找不到对应的 EGit插件,无法安装) E ...

  8. Android 框架修炼-自己封装双缓存管理框架库

    一.概述 Android开发中,网络请求是很重要的一部分,而缓存网络请求来的图片或者响应结果字符串或者结果流,既可以省流量,同时也可以帮助我们 解决无网或弱网情况下加载情况,当然也可以提升程序性能效率 ...

  9. Hibernate - list()和iterate()的区别

    list()和iterate()都可以用来获得Query取得的HQL结果list()使用的是即时加载.查询时会之前去数据库查询HQL并将所有结果存在缓存中.iterate()使用的是延时加载.查询时只 ...

  10. 分布式 ES 操作流程解析

    概念解析 CURD 操作 CURD 操作都是针对具体的某个或某些文档的操作,每个文档的 routing 都是确认的,所以其所在分片也是可以事先确定的.该过程对应 ES 的 Document API. ...