栈的定义为只允许在表的末端进行插入和删除的线性表。简而言之就是先进后出的线性表。

插入和删除的一端被称呼为栈顶(top),而不允许插入删除的一端被称为栈底(bottom)。无元素时的栈即为空栈。

使用一维数组实现栈

  1. //stack.h
  2. #ifndef STACK_H
  3. #define STACK_H
  4. #include<iostream>
  5. #include<assert.h>
  6. using namespace std;
  7. const int maxSize = 50;
  8.  
  9. template<class T>
  10. class Stack
  11. {
  12. public:
  13. Stack(){};
  14. virtual void Push(const T& x) = 0;
  15. virtual void Pop(T& x) = 0;
  16. virtual bool getTop(T& x) = 0;
  17. virtual bool IsEmpty()const = 0;
  18. virtual bool IsFull()const = 0;
  19. virtual int getSize()const = 0;
  20. };
  21. #endif
  1. //main.cpp

    #include"stack.h"
  2. const int stackIncreament = 20;
  3.  
  4. template<class T>
  5. class SeqStack : public Stack<T>
  6. {
  7. private:
  8. T *elements; //栈数组
  9. int top; //栈顶指针
  10. int maxSize;//栈的大小
  11. void overflowProcess();//自动扩容函数
  12. public:
  13. SeqStack(int sz = 50);
  14. ~SeqStack(){delete[]this->elements;}
  15. void Push(const T& x);//向栈中压入元素
  16. void Pop(T& x);//出栈
  17. bool getTop(T& x);//获取栈顶元素
  18. bool IsEmpty()const{return (this->top==-1 ? true : false);}
  19. bool IsFull()const{return (this->top+1==this->maxSize ? true : false);}
  20. int getSize()const{return this->top+1;}
  21. void MakeEmpty(){this->top = -1;}//使栈空
  22. void print();
  23. friend ostream& operator<<(ostream& out, SeqStack<T>& s)//声明为友元函数,重载输出运算符<<
  24. {
  25. out<<"top = "<<s.top<<endl;
  26. for(int i=0; i<=s.top; ++i)
  27. out<<i<<":"<<s.elements[i]<<endl;
  28. return out;
  29. }
  30. };
  31. template<class T>
  32. void SeqStack<T>::print()
  33. {
  34. if(!this->IsEmpty())
  35. {
  36. for(int i=this->top; i>=0; --i)
  37. cout<<" ["<<this->elements[i]<<"] ";
  38. cout<<endl;
  39. }
  40. }
  41. template<class T>
  42. void SeqStack<T>::Push(const T& x)
  43. {
  44. if(!this->IsFull())
  45. {
  46. ++this->top;
  47. this->elements[this->top] = x;
  48. }
  49. else
  50. {
  51. this->overflowProcess();
  52. this->elements[this->top] = x;
  53. ++this->top;
  54. }
  55. };
  56. template<class T>
  57. void SeqStack<T>::Pop(T& x)
  58. {
  59. if(!this->IsEmpty())
  60. {
  61. x = this->elements[this->top];
  62. --this->top;
  63. }
  64. };
  65. template<class T>
  66. bool SeqStack<T>::getTop(T& x)
  67. {
  68. if(!this->IsEmpty())
  69. {
  70. x = this->elements[this->top-1];
  71. return true;
  72. }
  73. return false;
  74. };
  75. template<class T>
  76. void SeqStack<T>::overflowProcess()
  77. {
  78. T *newArry = new T[maxSize+stackIncreament];
  79. if(newArry == NULL)
  80. {
  81. cout<<"内存分配失败!"<<endl;
  82. exit(1);
  83. }
  84. for(int i=0; i<this->maxSize; ++i)
  85. newArry[i] = this->elements[i];
  86. this->maxSize = this->maxSize+stackIncreament;
  87. delete[]this->elements;
  88. this->elements = newArry;
  89. };
  90. template<class T>
  91. SeqStack<T>::SeqStack(int sz):top(-1),maxSize(sz)
  92. {
  93. this->elements = new T[this->maxSize];
  94. assert(this->elements != NULL);
  95. };
  96.  
  97. int main()
  98. {
  99. SeqStack<int> ss;
  100. for(int i=0; i<60; ++i)
  101. ss.Push(i);
  102. int i = int();
  103. ss.Pop(i);
  104. cout<<i<<endl;
  105. ss.print();
  106. cout<<ss<<endl;
  107. return 0;
  108. }

试试执行效果

因为换行过多没有将整幅图上传。

顺序栈(C++)的更多相关文章

  1. 数据结构:C_顺序栈的实现

    数据结构顺序栈的实现(C语言版) 1.写在前面 栈是一种遵循元素先进(Push)后出(Pop)规则的线性表,它的实现可以用数组或者链表. ..... 2.代码分解 2.1对栈的结构定义: typede ...

  2. D_S 顺序栈的基本操作

    //  main.cpp #include <iostream> using namespace std; #include "Status.h" typedef in ...

  3. 数据结构Java实现05----栈:顺序栈和链式堆栈

    一.堆栈的基本概念: 堆栈(也简称作栈)是一种特殊的线性表,堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置进行插入和删除操作,而堆栈只允许在固定一端进行插入和删除 ...

  4. 01顺序栈_Stack---(栈与队列)

    #include "stdio.h" #include "stdlib.h" #include "io.h" #include " ...

  5. 把十进制整数转换为r(r=2)进制输出(顺序栈实现)

    上周的第二个作业补上~~ 上周的要求: 1.给出顺序栈的存储结构定义. 2.完成顺序栈的基本操作函数. 1)      初始化顺序栈 2)      实现入栈和出栈操作 3)      实现取栈顶元素 ...

  6. 数据结构之顺序栈SqStack

    顺序栈SqStack 基本操作 Status InitStack()//构造一个空栈S Status DestroyStack()//销毁栈S,S不再存在 Status ClearStack()//把 ...

  7. 顺序栈之C++实现

    顺序栈就是用顺序表(数组)实现的栈.其组织形式如下图所示: 下面介绍下我用C++实现的顺序栈,在VC6下调试通过.不足之处还请指正. 1.文件组织 2.ss.h栈类的声明及宏的定义 #ifndef _ ...

  8. 顺序栈和链式栈(C++实现)

    顺序栈,是一种基于数组的存储表示. 实现类代码如下: template<class T> class SeqStack{ T *element; int top; int maxSize; ...

  9. salesforce零基础学习(七十六)顺序栈的实现以及应用

    数据结构中,针对线性表包含两种结构,一种是顺序线性表,一种是链表.顺序线性表适用于查询,时间复杂度为O(1),增删的时间复杂度为O(n).链表适用于增删,时间复杂度为O(1),查询的时间复杂度为O(n ...

  10. 【小白成长撸】--顺序栈(C语言版)

    // 顺序栈.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h"//test1.0--栈表仅限Int类型 #include <stdio. ...

随机推荐

  1. Android Jetpack Compose 引入示例工程

    引入 Jetpack Compose 示例工程 去GitHub上找到Compose的示例工程 https://github.com/android/compose-samples ,clone到本地 ...

  2. linux&c 进程控制 课后习题

    (声明:本篇博客只是博主自己的理解,加以整理,目的是总结刚学过的进程知识,不一定绝对正确,非常愿意听客官您提出宝贵意见.) Q1:进程中的全局数据段(全局变量),局部数据段(局部变量),静态数据段的分 ...

  3. TestNG 参数化应用

    一.第一种参数化方式(testng.xml配置参数) 1.新建ParameterDemo04类 2.拷贝类的路径 3.testng.xml配置类地址及参数 <?xml version=" ...

  4. url的hash和HTML5的history

    url的hash和HTML5的history 第一种方法是改变url的hash值. **显示当前路径 : **location.href http://localhost:8080/# 切换路径: l ...

  5. idea Mark Directory as 的几种文件类型

    1. Source roots (or source folders) 源文件夹 通过为该类别分配文件夹,可以告诉IntelliJ IDEA该文件夹及其子文件夹包含应在构建过程中进行编译的源代码. 2 ...

  6. 大爽Python入门教程 1-5 答案

    大爽Python入门公开课教案 点击查看教程总目录 1 方向变换 >>> 51//4 12 >>> 51%4 3 答: 向左转51次之后, 小明面朝东方, 转过了1 ...

  7. [bzoj1934]善意的投票

    最小割,考虑最小割就是要将整张图分为两块,本题中就分别表示赞同和不赞同,那么首先一开始赞同的点向S连边,不赞同的点向T连边,如果这些点分到了另一边就要割掉这条边,朋友关系同理,连双向边同样表示分到两边 ...

  8. springboot项目中常遇到的问题-初学者最容易犯的错

    1.在spring中有两个main方法 2.在idea中少提代码类了,或者某类中代码依赖关系没解决掉

  9. javascript-初级-day04js数据类型

    day01-js数据类型 <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type& ...

  10. MySQL 在线开启&关闭GTID模式

    MySQL 在线开启&关闭GTID模式 目录 MySQL 在线开启&关闭GTID模式 基本概述 在线开启GTID 1. 设置GTID校验ENFORCE_GTID_CONSISTENCY ...