C++栈的模板实现

#include<iostream>
using namespace std;
#pragma once
/*
1.判断栈是否为空
2.得到栈的长度
3.元素入栈
4.元素出栈
5.清空栈
6.栈顶元素
7.栈底元素
*/
template<typename T>
class MyStack
{
public:
 MyStack(void);
 ~MyStack(void);
 void push(T elem);
 void pop(T& elem);
 void clearStack();
 bool isEmpty();
 int stackLength();
 void stackTraverse(bool isFromBottom);//元素的编历
 int begin(); //栈顶元素
 int back();  //栈底元素
private:
 T* m_pBuffer;//栈空间地址
 int m_iTop; //指向栈顶,同时确定栈中元素个数
 int m_iSize; //栈的初始大小

};

template<typename T>
MyStack<T>::MyStack(void)
{
 m_iTop = 0;
 m_iSize = 5;
 m_pBuffer = new T[m_iSize];
}

template<typename T>
MyStack<T>::~MyStack(void)
{
 delete[] m_pBuffer;
}

template<typename T>
void MyStack<T>::push(T elem)
{
 /*
 以下用到了动态增加空间大小,而不是在初始化时,定义一个非常大的空间
 原理:
   注意:动态增加大小时,以原大小的两倍配置一块新的空间,
   然后将原内容拷贝过来, 并释放原空间,再将指针指向新的空间
 */
 if(m_iTop == m_iSize)
 {
  m_iSize *= 2;
  T* pTemp = new T[m_iSize];
  for(int i = 0;i < m_iTop; ++i)
  {
   pTemp[i] = m_pBuffer[i];
  }
  delete[] m_pBuffer;
  m_pBuffer = NULL;
  m_pBuffer = pTemp;
 }
 m_pBuffer[m_iTop] = elem;
 m_iTop++;
}

template<typename T>
void MyStack<T>::pop(T& elem)
{
 m_iTop--;
 elem = m_pBuffer[m_iTop];

}

template<typename T>
void MyStack<T>::clearStack()
{
 m_iTop = 0;
}

template<typename T>
bool MyStack<T>::isEmpty()
{
 if(m_iTop == 0)
 {
  return true;
 }
 return false;
}

template<typename T>
int MyStack<T>::stackLength()
{
 return m_iTop;
}

template<typename T>
void MyStack<T>::stackTraverse(bool isFromBottom)
{
 //栈底开始遍历
 if(isFromBottom)
 {
  for(int i = 0;i < m_iTop;++i)
  {
  cout<<m_pBuffer[i]<<endl;
  }
 }
 else
 {
  for(int i = m_iTop-1;i >= 0;--i)
  {
  cout<<m_pBuffer[i]<<endl;
  }
 }

}

template<typename T>
int MyStack<T>::begin()
{
 return m_pBuffer[m_iTop-1];
}

template<typename T>
int MyStack<T>::back()
{
 return m_pBuffer[0];
}

调用:(可以用再尝试传下坐标进去)

MyStack<int> *myStack =  new MyStack<int>();
 for(int i = 0 ;i < 100; ++i)
 {
  myStack->push(i);
 }
 
 cout << myStack->stackLength() << endl;
 cout << myStack->begin() << endl;
 cout << myStack->back() << endl;
 myStack->stackTraverse(false);
 myStack->clearStack();

cout<<"存储char类型"<<endl;
 MyStack<char> *charStack = new MyStack<char>();
 charStack->push(‘a‘);
 charStack->push(‘b‘);
 charStack->stackTraverse(false);

时间: 2024-07-31 14:26:17

C++栈的模板实现的相关文章

栈类模板

栈是只能从一端访问的线性群体,可以访问的这一端称栈顶,另一端称栈底.栈是一种后进先出的数据结构. 栈示意图 栈的应用举例——表达式处理 栈的基本状态 栈空 栈满 一般状态 栈空 栈中没有元素(以数组容纳的栈为例) 栈满 栈中元素个数达到上限(以数组容纳的栈为例) 一般状态 栈中有元素,但未达到栈满状态(以数组容纳的栈为例) 栈的基本操作 初始化 入栈 出栈 清空栈 访问栈顶元素 检测栈的状态(满.空) 例9-8 栈类模板 //Stack.h #ifndef STACK_H #define STA

数据结构之——基于链表的栈的模板实现

//节点的结构 template<typename T> struct node { T data; node<T>* next; node():next(nullptr){}; node(T t):data(t),next(nullptr){}; } //模板类构造栈类 template<typename T> Class MyStack { public: stack(); void push(T &x); T top(); void pop(); int

链表栈类模板

链表节点 ListNode.h 1 #include "stdafx.h" 2 #include<iostream> 3 using namespace std; 4 template <typename Type> class LinkStack; 5 template <typename Type> 6 // 链表节点 7 class ListNode{ 8 private: 9 friend class LinkStack<Type>

栈的模板

#include<iostream> using namespace std; // void push(int x); int pop(); bool isEmpty(); bool isFull(); // int A[5010],top=0; int main() { push(50); cout<<pop()<<endl; cout<<top; } void push(int x) { if(isFull) { A[top]=x; top++; }

数据结构基础之栈

数据结构之栈结构: 1.  栈的特点: 相比于一个普通的数组,栈控制了操作的方法,元素只能在栈顶入栈,也只能在栈顶出栈. 2.  栈的用途: 在深入优先搜索(DFS)中会用到,比如现在有一个图如下: 现在要从A出发要遍历整张图,那么首先看与A相连的B.D,任选一个,比如B,那么要先保存A,将其压入栈,然后遍历B,B又到C,然后C没有其余的路径就可以返回了,取出栈顶的元素B,B也没有其余路径,再取出栈顶元素A,现在A可以走D,那么D压入栈,走E,返回到D,再返回到A,现在A是出发点,又没有其余路径

类模板的用法

1.格式:template<模板参数表>  (参数可以直接定义默认值) class 类名 { ...}; 其成员函数可以在类外定义. eg: 1 template <class TNO,class TScore=int,int num=10> 2 class S 3 { 4 private: 5 TNO Sid[num]; 6 public: 7 int bel(TScore ascore); 8 void sort(); 9 }; 10 template <class TN

从零开始建立Rancher Catalog模板 - Part 1

Rancher提供了许多可重用的.预先构建好的程序栈的模板.拓展这些已有的模板或者创建并分享已完成的新模板,是参与Rancher用户社区的好方式.同时,这也可以帮助你的组织更高效地利用基于容器的技术.这个系列的文章致力于通过现有的最好的工具和技术来帮助新Catalog模板的作者快速投入工作. 在这篇文章中,我们将构建一个十分简单(但不是非常有用)的Cattle Catalog模板.在下一篇文章中,我们将以更多细节来完善这个模板,直到我们拥有一个可以正常工作的.多容器的.基于NGINX的静态网站,

线性表之顺序栈C++实现

线性表之顺序栈 栈是限定仅在表尾(栈顶)进行插入删除操作的线性表,FILO:先进后出 一.顺序栈的头文件:SeqStack.h //顺序栈头文件#include<iostream>using namespace std;//设置顺序栈的大小const int StackSize = 10;template<class DataType>//定义顺序栈的模板类型class SeqStack{public: //无参构造器,初始化栈顶指针 SeqStack(){ top = -1; }

栈操作之栈链

数据结构: 栈是允许在同一端进行插入和删除操作的特殊线性表.允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom):栈底固定,而栈顶浮动:栈中元素个数为零时称为空栈.插入一般称为进栈(PUSH),删除则称为退栈(POP).栈也称为后进先出表. 操作系统: 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈 栈使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放. 栈链模板代码: #define TRUE 1 #def