#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. virtualbox 创建com对象失败

    其实这个错误是因为VirtualBox不兼容Win7引起的,只要把VirtualBox的兼容模式改为出Win7以外的就行了.. 右键VirtualBox的桌面快捷方式,选择属性,选到兼容性选项卡,勾选 ...

  2. Lotus分析

    一 Lotus的任务 Lotus是一个消息通知服务,topic和subscription是多对多的关系.后面我加了一个发送自定义邮件和自定义短信的功能. 产品里面有个监控报警和通知列表.监控报警里创建 ...

  3. UvaLive 6667 Longest Chain (分治求三元组LIS&amp;树状数组)

    题目链接: here 题意: 和hdu4742类似.差别就是一部分三元组是直接给出的.另一部分是用他给的那个函数生成的.还有就是这里的大于是严格的大于a>b必须ax>bx,ay>by ...

  4. JFinal之学习资源

    JFinal官网: http://www.jfinal.com/ JFinal在线API: http://tool.oschina.net/apidocs/apidoc?api=jfinal JFin ...

  5. Android Touch事件原理加实例分析

    Android中有各种各样的事件,以响应用户的操作.这些事件可以分为按键事件和触屏事件.而Touch事件是触屏事件的基础事件,在进行Android开发时经常会用到,所以非常有必要深入理解它的原理机制. ...

  6. 【linux c learn 之stat】获取文件的属性

    NAME stat 获取文件属性 这个函数位于<sys/stat.h>头文件里 函数原型: int stat(const char *path, struct stat *buf); 參数 ...

  7. perl指针引用

    http://bbs.chinaunix.net/forum-viewthread-tid-570031.html

  8. html5中viewport使用

    html5中viewport使用 转载自:http://www.maoegg.com/the-usage-of-viewport-in-html5/ 用html5开发移动应用时往往会遇到手机的分辨率或 ...

  9. 读 Runtime 源码:对象与引用计数

    以前只是看了很多博客,这次打算看一下源码,并记录下来.想到哪里就读到哪里,写到哪里.读的代码版本是:objc runtime 680,可以从这里下载 https://github.com/RetVal ...

  10. 将指定SQL的执行计划从共享池删除的方法

    如果Oracle的优化器产生了某种错误的执行计划,或者我们希望Oracle对于某个SQL重新进行分析,那么就需要这个SQL的执行计划在共享池中过期,而简单的方法在10.2.0.4以后才出现.   对于 ...