栈(链式存储) C++模板实现
#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++模板实现的更多相关文章
- 基于链式链表的栈链式存储的C风格实现
链式链表的头文件与CPP文件见前文 头文件: #ifndef _LINKSTACK_H_ #define _LINKSTACK_H_ typedef void LinkStack; //创建一个栈 L ...
- C 栈 链式存储
#ifndef _MY_LINKSTACK_H_ #define _MY_LINKSTACK_H_ typedef void LinkStack; LinkStack* LinkStack_Creat ...
- 栈的链式存储 - API实现
基本概念 其它概念详情參看前一篇博文:栈的顺序存储 - 设计与实现 - API实现 这里也是运用了链表的链式存储API高速实现了栈的API. 代码: // linkstack.h // 链式存储栈的A ...
- C++编程练习(4)----“实现简单的栈的链式存储结构“
如果栈的使用过程中元素数目变化不可预测,有时很小,有时很大,则最好使用链栈:反之,如果它的变化在可控范围内,使用顺序栈会好一些. 简单的栈的链式存储结构代码如下: /*LinkStack.h*/ #i ...
- 【Java】 大话数据结构(6) 栈的顺序与链式存储
本文根据<大话数据结构>一书,实现了Java版的栈的顺序存储结构.两栈共享空间.栈的链式存储机构. 栈:限定仅在表尾进行插入和删除操作的线性表. 栈的插入(进栈)和删除(出栈)操作如下图所 ...
- 栈的顺序存储和链式存储c语言实现
一. 栈 栈的定义:栈是只允许在一端进行插入或删除操作的线性表. 1.栈的顺序存储 栈顶指针:S.top,初始设为-1 栈顶元素:S.data[S.top] 进栈操作:栈不满时,栈顶指针先加1,再到栈 ...
- C语言- 基础数据结构和算法 - 栈的链式存储
听黑马程序员教程<基础数据结构和算法 (C版本)>, 照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友 ...
- [置顶] ※数据结构※→☆线性表结构(queue)☆============优先队列 链式存储结构(queue priority list)(十二)
优先队列(priority queue) 普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除.在优先队列中,元素被赋予优先级.当访问元素时,具有最高优先级的元素最先删除.优先队列具有 ...
- Java实现链式存储的二叉树
二叉树的定义: 二叉树(BinaryTree)是n(n≥0)个结点的有限集,它或者是空集(n=0),或者由一个根结点及两棵互不相交的.分别称作这个根的左子树和右子树的二叉树组成. 二叉树的遍历方式主要 ...
- javascript实现数据结构:线性表--线性链表(链式存储结构)
上一节中, 线性表的顺序存储结构的特点是逻辑关系上相邻的两个元素在物理位置上也相邻,因此可以随机存取表中任一元素,它的存储位置可用一个简单,直观的公式来表示.然后,另一方面来看,这个特点也造成这种存储 ...
随机推荐
- 08重编终极版《东邪西毒:终极版》DVD粤语中字
1.东邪西毒].Ashes.of.Time.1994.384p.DVDRip.x264.ac3-DTMM.mkv 这个版本最清晰 ,可惜删减了,只有87分钟,粤语,1.4G. 2.东邪西毒(初始版). ...
- Oracle VM Virtual Box 4.3 小巧精悍的虚拟机软件
https://www.virtualbox.org/wiki/Downloads Download VirtualBox Here, you will find links to VirtualBo ...
- JavaScript学习总结-技巧、有用函数、简洁方法、编程细节
整理JavaScript方面的一些技巧.比較有用的函数,常见功能实现方法,仅作參考 变量转换 //edit http://www.lai18.com var myVar = "3.14159 ...
- 了解undefined、null、NaN的区别
1.常规的解释,null是个对象,表示空值,undefined也是个对象,表示没有定义 2.详细分析 null 书上的解释(Javascript权威指南),Javascript的关键词null是一种特 ...
- TOP30专访:捕鱼达人陈昊芝
原文:http://www.csdn.net/article/2012-04-04/313919/1 编者按:3月31日,第四届CocoaChina游戏开发者大会暨Cocos2D-X技术研讨会在北京举 ...
- linux实例 批量修改图片文件名
1.如10.11一批这样的目录,10.11 10.12等等 然后里面的图片.jpg文件要修改成对应的日期.jpg,也就是说 编程1011.jpg这样的文件名 示例如下: #!/bin/bashfor ...
- win8上装Oracle 12c Client
安装之前要保证已装Microsoft Visual C++ Redistributable 32 bit: http://www.microsoft.com/download/en/details.a ...
- [转]在.Net中使用Oracle的表类型和对象类型
本文转自:http://www.cnblogs.com/studyzy/archive/2010/10/13/1850161.html 在一般的数据存取操作过程中,如果要对一个主表和对应的子表进行插入 ...
- 输入参数varargin
一种特别的输入参数varargin 可以在自定义函数中得到,这种函数支持输入参数的变量的个数.这个参数显在输入参数列表的最后一项,它返回一个单元阵列,所以一个输入实参可以包括任意数目的实参.每一个实参 ...
- iOS开发--Swift RAC响应式编程
时间不是很充足, 先少说点, RAC的好处是响应式编程, 不需要自己去设置代理委托, target, 而是主要以信息流(signal), block为主, 看到这里激动吧, 它可以帮你监听你的事件, ...