栈的特点是先进后出以及只能在栈顶进行插入和删除操作

本次实现的栈的基本操作:

1)弹栈

2)压栈

3)求栈大小

4)求栈容量

5)判断栈空

6)获取栈顶元素

1、用数组的方式实现栈基本操作

 /**
*
*作者:Ycute
*时间:2019-11-15-09.55.27
*题目题意简单描述:用C++模板实现栈
*/ #include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std; template<typename T>
class Stack{
public:
Stack();
~Stack();
public:
T top();//获得栈顶元素
void push(T t);//入栈
T pop();//出栈
bool is_empty();//判断栈是否为空
int size();//栈大小
int capa();//栈容量
private:
int count;//栈元素数量
int capacity;//栈容量
T *array;//底层为数组
}; template<typename T>
Stack<T>::Stack(){
capacity=;
array=new T[capacity];
count=;
} template<typename T>
Stack<T>::~Stack(){
delete []array;
} /*栈空判断*/
template<typename T>
bool Stack<T>::is_empty(){
return count==;
}
/*获得栈顶元素*/
template<typename T>
T Stack<T>::top(){
if(count!=){
return array[count-];
}
return -;
}
/*入栈*/
template<typename T>
void Stack<T>::push(T t){
if(count!=capacity){
array[count++]=t;
}
}
/*出栈*/
template<typename T>
T Stack<T>::pop(){
if(count!=){
return array[--count];
}
return -;
} /*获得栈大小*/
template<typename T>
int Stack<T>::size(){
return count;
} template<typename T>
int Stack<T>::capa(){
return capacity;
} int main(){
Stack<int> s1;
cout<<"栈大小"<<s1.size()<<endl;
cout<<"栈容量"<<s1.capa()<<endl;
s1.push();
s1.push();
s1.push();
cout<<"栈是否为空"<<s1.is_empty()<<endl;
cout<<"出栈"<<s1.pop()<<endl;
cout<<"栈顶"<<s1.top()<<endl;
cout<<"栈大小"<<s1.size()<<endl;
cout<<"栈容量"<<s1.capa()<<endl;
return ;
}

2、用单链表的方式实现栈基本操作

用一个指针,采用头插法,实现的入栈出栈。

 /**
*
*作者:YCute
*时间:2019-11-15-10.40.56
*题目题意简单描述:用单链表实现栈
*/ #include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std; /*栈数据节点*/
template<typename T>
struct Node{
Node(T t):value(t),next(NULL){};
Node():next(NULL){};
T value;
Node<T> *next;
}; template<typename T>
class Stack{
public:
Stack();
~Stack();
public:
T top();//获得栈顶元素
T pop();//出栈
void push(T t);//入栈
int size();//栈大小
bool is_empty();//判断栈空
private:
int count;
Node<T>* head;
}; template<typename T>
Stack<T>::Stack(){
count=;
head = new Node<T>();
head->next = nullptr;
} template<typename T>
Stack<T>::~Stack(){
while(head->next!=nullptr){
Node<T> *nodeDel=head->next;
head->next=head->next->next;
delete nodeDel;
}
} /*获得栈顶元素*/
template<typename T>
T Stack<T>::top(){
if(head->next!=nullptr){
return head->next->value;
}
} /*出栈*/
template<typename T>
T Stack<T>::pop(){
if(head->next!=nullptr){
Node<T> *nodeDel=head->next;
head->next=head->next->next;
T value=nodeDel->value;
delete nodeDel;
--count;
return value;
}
} /*入栈*/
template<typename T>
void Stack<T>::push(T t){
Node <T> *subNode=new Node<T>(t);
subNode->next=head->next;
head->next=subNode;
++count;
} /*获得栈元素*/
template<typename T>
int Stack<T>::size(){
return count;
} /*判断栈空*/
template<typename T>
bool Stack<T>::is_empty(){
return count==;
} int main(){
Stack<int> s1;
s1.push();
s1.push();
s1.push();
s1.push();
cout<<"栈大小"<<s1.size()<<endl;
cout<<"栈顶元素"<<s1.top()<<endl;
while(!s1.is_empty()){
cout<<" "<<s1.pop();
}
cout<<"栈大小"<<s1.size()<<endl;
return ;
}

简单实现C++Stack模板的更多相关文章

  1. 简单的Verilog测试模板结构

    这里记录一下曾经用到的简单的测试模板,如下所示: //timescale `timescale 1ns/1ns module tb_module(); //the Internal motivatio ...

  2. 从零开始学C++之模板(三):缺省模板参数(借助标准模板容器实现Stack模板)、成员模板、关键字typename

    一.缺省模板参数 回顾前面的文章,都是自己管理stack的内存,无论是链栈还是数组栈,能否借助标准模板容器管理呢?答案是肯定的,只需要多传一个模板参数即可,而且模板参数还可以是缺省的,如下: temp ...

  3. 缺省模板参数(借助标准模板容器实现Stack模板)、成员模板、关键字typename

    一.缺省模板参数 回顾前面的文章,都是自己管理stack的内存,无论是链栈还是数组栈,能否借助标准模板容器管理呢?答案是肯定的,只需要多传一个模板参数即可,而且模板参数还可以是缺省的,如下: temp ...

  4. 简单的html渲染模板引擎

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  5. 一个LaTeX 中文文档的简单而实用的模板

    网上找的一个latex中文模板,感觉很简单,在我机器上有点小问题,完善记录一下. %要运行该模板,LaTex需要安装CJK库以支持汉字. %字体大小为12像素,文档类型为article %如果你要写论 ...

  6. C++之Stack模板类

    假设有这样一种情况:某人将一车文件交给小王.倘若小王的抽屉是空的,那么小王从车上取出最上面的文件将其放入抽屉:倘若抽屉是满的,小王从抽屉中取出最上面的文件,放入垃圾篓:倘若抽屉即不空也未满,那么小王抛 ...

  7. 线段树:CDOJ1591-An easy problem A (RMQ算法和最简单的线段树模板)

    An easy problem A Time Limit: 1000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Pr ...

  8. 一个简单的inno setup模板

    一.模板代码 基本功能包括多路径安装.多语言.自定义图标. [Setup] ShowLanguageDialog=yes AppCopyright=Copyright Reserved(C) , 36 ...

  9. Infix to postfix 用stack模板,表达式没有括号

    #include<stack> #include<iostream> #include<string> using namespace std; //优先级判断 c ...

随机推荐

  1. PHP 获取图像宽度与高度

    PHP 获取图像宽度函数:imagesx() imagesx() 函数用于获取图像的宽度,单位为像素,返回值为整型.高佣联盟 www.cgewang.com 语法: int imagesx( reso ...

  2. JS&ES6学习笔记(持续更新)

    ES6学习笔记(2019.7.29) 目录 ES6学习笔记(2019.7.29) let和const let let 基本用法 let 不存在变量提升 暂时性死区 不允许重复声明 块级作用域 级作用域 ...

  3. .net hbase client--终于浮出水面的轮子

    一.开篇 1.背景 在大数据时代,HBase 数据库是个绕不开的热门话题. 由于其使用 Java 作为主要开发语言,并且依赖大量的 Java 组件(如 Hadoop.zooKeep),使得其他技术栈想 ...

  4. 如何在 Android 安卓手机上运行 Node.js 应用 | 如何在安卓手机配置node开发环境

    最近在学习js,由于没法随身携带笔记本电脑,在手机翻阅<JavaScript高级程序设计>时,时常想调试一下书中的代码.于是就有了,能否在手机上配置一个js开发环境.考虑到手机上的Chro ...

  5. 基于asp.net core 从零搭建自己的业务框架(一)

    前言 asp.net core版本选择2.2,只是因为个人习惯了vs2017,代码以及设计皆可移植到vs2019,用asp.net core 3.0以及以上运行起来 项目类似选择web api,基础设 ...

  6. kafka的学习1

    1.Kafka是什么? Apache Kafka 是一款开源的分布式消息引擎系统.倘若“消息引擎系统”这个词对你来说有点陌生的话,那么“消息队列”“消息中间件”的提法想必你一定是有所耳闻的.不过说实话 ...

  7. iOS alertController自带的输入框

    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:nil message:@" ...

  8. property补充

    property补充 # class Foo: # @property # def AAA(self): # print('get的时候运行我啊') # # @AAA.setter # def AAA ...

  9. “随手记”开发记录day06

    今天还是继续完成统计页面,完成的按钮有支出大头和收入来源的饼状图, 由于之前写过相关的代码,这次的任务对我们来说还挺简单的,没有出现什么太大的问题,

  10. Linux安装python 3

    方法: 1.官网下载地址:http://www.python.org/download/ 2.rz -y 上传到Linux  解压tar -xvzf Python-3.5.1.tgz  进入目录   ...