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

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

1)弹栈

2)压栈

3)求栈大小

4)求栈容量

5)判断栈空

6)获取栈顶元素

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

  1. /**
  2. *
  3. *作者:Ycute
  4. *时间:2019-11-15-09.55.27
  5. *题目题意简单描述:用C++模板实现栈
  6. */
  7.  
  8. #include<iostream>
  9. #include<cmath>
  10. #include<cstring>
  11. #include<algorithm>
  12. #include<vector>
  13. using namespace std;
  14.  
  15. template<typename T>
  16. class Stack{
  17. public:
  18. Stack();
  19. ~Stack();
  20. public:
  21. T top();//获得栈顶元素
  22. void push(T t);//入栈
  23. T pop();//出栈
  24. bool is_empty();//判断栈是否为空
  25. int size();//栈大小
  26. int capa();//栈容量
  27. private:
  28. int count;//栈元素数量
  29. int capacity;//栈容量
  30. T *array;//底层为数组
  31. };
  32.  
  33. template<typename T>
  34. Stack<T>::Stack(){
  35. capacity=;
  36. array=new T[capacity];
  37. count=;
  38. }
  39.  
  40. template<typename T>
  41. Stack<T>::~Stack(){
  42. delete []array;
  43. }
  44.  
  45. /*栈空判断*/
  46. template<typename T>
  47. bool Stack<T>::is_empty(){
  48. return count==;
  49. }
  50. /*获得栈顶元素*/
  51. template<typename T>
  52. T Stack<T>::top(){
  53. if(count!=){
  54. return array[count-];
  55. }
  56. return -;
  57. }
  58. /*入栈*/
  59. template<typename T>
  60. void Stack<T>::push(T t){
  61. if(count!=capacity){
  62. array[count++]=t;
  63. }
  64. }
  65. /*出栈*/
  66. template<typename T>
  67. T Stack<T>::pop(){
  68. if(count!=){
  69. return array[--count];
  70. }
  71. return -;
  72. }
  73.  
  74. /*获得栈大小*/
  75. template<typename T>
  76. int Stack<T>::size(){
  77. return count;
  78. }
  79.  
  80. template<typename T>
  81. int Stack<T>::capa(){
  82. return capacity;
  83. }
  84.  
  85. int main(){
  86. Stack<int> s1;
  87. cout<<"栈大小"<<s1.size()<<endl;
  88. cout<<"栈容量"<<s1.capa()<<endl;
  89. s1.push();
  90. s1.push();
  91. s1.push();
  92. cout<<"栈是否为空"<<s1.is_empty()<<endl;
  93. cout<<"出栈"<<s1.pop()<<endl;
  94. cout<<"栈顶"<<s1.top()<<endl;
  95. cout<<"栈大小"<<s1.size()<<endl;
  96. cout<<"栈容量"<<s1.capa()<<endl;
  97. return ;
  98. }

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

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

  1. /**
  2. *
  3. *作者:YCute
  4. *时间:2019-11-15-10.40.56
  5. *题目题意简单描述:用单链表实现栈
  6. */
  7.  
  8. #include<iostream>
  9. #include<cmath>
  10. #include<cstring>
  11. #include<algorithm>
  12. #include<vector>
  13. using namespace std;
  14.  
  15. /*栈数据节点*/
  16. template<typename T>
  17. struct Node{
  18. Node(T t):value(t),next(NULL){};
  19. Node():next(NULL){};
  20. T value;
  21. Node<T> *next;
  22. };
  23.  
  24. template<typename T>
  25. class Stack{
  26. public:
  27. Stack();
  28. ~Stack();
  29. public:
  30. T top();//获得栈顶元素
  31. T pop();//出栈
  32. void push(T t);//入栈
  33. int size();//栈大小
  34. bool is_empty();//判断栈空
  35. private:
  36. int count;
  37. Node<T>* head;
  38. };
  39.  
  40. template<typename T>
  41. Stack<T>::Stack(){
  42. count=;
  43. head = new Node<T>();
  44. head->next = nullptr;
  45. }
  46.  
  47. template<typename T>
  48. Stack<T>::~Stack(){
  49. while(head->next!=nullptr){
  50. Node<T> *nodeDel=head->next;
  51. head->next=head->next->next;
  52. delete nodeDel;
  53. }
  54. }
  55.  
  56. /*获得栈顶元素*/
  57. template<typename T>
  58. T Stack<T>::top(){
  59. if(head->next!=nullptr){
  60. return head->next->value;
  61. }
  62. }
  63.  
  64. /*出栈*/
  65. template<typename T>
  66. T Stack<T>::pop(){
  67. if(head->next!=nullptr){
  68. Node<T> *nodeDel=head->next;
  69. head->next=head->next->next;
  70. T value=nodeDel->value;
  71. delete nodeDel;
  72. --count;
  73. return value;
  74. }
  75. }
  76.  
  77. /*入栈*/
  78. template<typename T>
  79. void Stack<T>::push(T t){
  80. Node <T> *subNode=new Node<T>(t);
  81. subNode->next=head->next;
  82. head->next=subNode;
  83. ++count;
  84. }
  85.  
  86. /*获得栈元素*/
  87. template<typename T>
  88. int Stack<T>::size(){
  89. return count;
  90. }
  91.  
  92. /*判断栈空*/
  93. template<typename T>
  94. bool Stack<T>::is_empty(){
  95. return count==;
  96. }
  97.  
  98. int main(){
  99. Stack<int> s1;
  100. s1.push();
  101. s1.push();
  102. s1.push();
  103. s1.push();
  104. cout<<"栈大小"<<s1.size()<<endl;
  105. cout<<"栈顶元素"<<s1.top()<<endl;
  106. while(!s1.is_empty()){
  107. cout<<" "<<s1.pop();
  108. }
  109. cout<<"栈大小"<<s1.size()<<endl;
  110. return ;
  111. }

简单实现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. 设置x 轴斜体(每次我都百度,这次单独为它发一个)

    plt.xticks(rotation = 45) 2020-06-07

  2. WPF 半透明 模糊效果 Aero效果(1)

    先看看效果图 目前网上找到了2种实现方式,一种是 .NET Framework4.5及以后有自带的 WindowChrome 效果,一种是 WindowsAPI  dwmapi.dll  ,但这两种在 ...

  3. Python time ctime()方法

    描述 Python time ctime() 函数把一个时间戳(按秒计算的浮点数)转化为time.asctime()的形式.高佣联盟 www.cgewang.com 如果参数未给或者为None的时候, ...

  4. Skill 脚本演示 ycCommonCenterMos.skl

    https://www.cnblogs.com/yeungchie/ ycCommonCenterMos.skl 自动生成一个共质心差分对 Mos ,可以自定布局类型. 回到目录

  5. TearmQuery()

    lucene 中的  TearmQuery() 在.search( tearmQuery, q)查询时 比较矫情 q只能是小写

  6. 求解最长递增子序列(LIS) | 动态规划(DP)+ 二分法

    1.题目描述     给定数组arr,返回arr的最长递增子序列. 2.举例     arr={2,1,5,3,6,4,8,9,7},返回的最长递增子序列为{1,3,4,8,9}. 3.解答      ...

  7. Python爬虫的经典多线程方式,生产者与消费者模型

    在之前的文章当中我们曾经说道,在多线程并发的场景当中,如果我们需要感知线程之间的状态,交换线程之间的信息是一件非常复杂和困难的事情.因为我们没有更高级的系统权限,也没有上帝视角,很难知道目前运行的状态 ...

  8. WebService简单Demo

    看了网上好多关于webservice的例子,基本上对初学者来说都是模棱两可云里雾里,现在,我将网上关于webservice的讲解提炼出来,通过一个最简单使用并且方便的例子,告诉大家什么是webserv ...

  9. Linux学习笔记之如何在图形界面旁边把终端添加显示出来

    首先旁边无终端,我们可以点击ctrl+alt+t,可以把终端显示出来 右键点击终端,然后点击Lock to Launcher,然后完成 PS:不想显示也可以点击其右键,选择Unlock from La ...

  10. 6、单例模式 Singleton模式 只有一个实例 创建型模式

    1.了解Singleton模式 程序在运行时,通常都会生成很多实例.例如,表示字符串的java . lang . string类的实例与字符串是- -对- -的关系,所以当有1000个字符串的时候,会 ...