用类模板改写stack

对于栈中支持的变量类型因为问题的不同,变量也不同。用类模板来改写stack可以方便的在不同变量间切换。

MyStack.h

#ifndef MyStack_h
#define MyStack_h
template <typename T>//类模板
class MyStack
{
public:
     MyStack(int size);//分配内存初始化栈空间,设定容量
       ~MyStack();//回收内存
       bool stackEmpty();//判空
       bool stackFull();//判满
       void ClearStack();//清空
       int stackLength();//计算长度
       bool push(T elem);//入栈,栈顶上升
       bool pop(T &elem);//出栈,栈顶下降
       void stackTraverse(bool isFrombottom);//遍历
private:
    T *m_pbuffer;
    int m_iSize;
    int m_iTop;
};
template <typename T>
MyStack <T>::MyStack(int size)
{
    m_iSize=size;
    m_pbuffer = new T[size];
    m_iTop=0;
}
template <typename T>
MyStack <T>::~MyStack()
{
    delete []m_pbuffer;
}
template <typename T>
bool MyStack <T>::stackEmpty()
{
    if(0==m_iTop)
        {
            cout<<"栈为空"<<endl;
            return true;
    }
        
    else
        return false;
}

template <typename T>
bool MyStack <T>::stackFull()
{
    if(m_iTop==m_iSize)
        return true;
    else
        return false;
}
template <typename T>
int MyStack <T>::stackLength()
{
    return m_iTop;
}
template <typename T>
void MyStack <T>::ClearStack()
{
    m_iTop=0;
    
}
template <typename T>
bool MyStack <T>::push(T elem)
{
    if(stackFull())
    {
        return false ;
    }

    m_pbuffer[m_iTop]=elem;
    m_iTop++;
    return true;
}
template <typename T>
bool  MyStack <T>::pop(T &elem)
{
    if(stackEmpty())
        return false;
    else
        m_iTop--;
        elem=m_pbuffer[m_iTop];
        return true;
    
}
template <typename T>
void MyStack <T>::stackTraverse(bool isFrombottom)
{
    if(isFrombottom)
    {
        for(int i=0;i<=m_iTop;i++)
        cout<<m_pbuffer[i];
        //m_pbuffer[i].printCoordinate();
    }
    else
        {for(int i=m_iTop-1;i>=0;i--)    
            cout<<m_pbuffer[i]<<",";
         //m_pbuffer[i].printCoordinate();
    }
}
#endif

demo.cpp

#include<iostream>
#include<stdlib.h>
#include"MyStack.h"
#include"Coordinate.h"
using namespace std;
/**********************************/
/*
  栈类
  要求:
       MyStack(int size);//分配内存初始化栈空间,设定容量
       ~MyStack();//回收内存
       bool stackEmpty();//判空
       bool stackFull();//判满
       void ClearStack();//清空
       int stackLength();//计算长度
       void push(char elem);//入栈,栈顶上升
       char pop(char &elem);//出栈,栈顶下降
       void stackTraverse();//遍历
       */
void main()
{
    MyStack<Coordinate> *s=new MyStack<Coordinate>(5);
    s->push(Coordinate(1,2));
    s->push(Coordinate(3,4));
    

    //s->ClearStack();
    s->stackTraverse(true);
    cout<<s->stackLength()<<endl;
    s->stackEmpty();
    if(s->stackFull())
    {
        cout<<"栈为满"<<endl;
    }
    

    delete s;
    s=NULL;
    system("pause");
}

Coordinate.h

#ifndef Coordinate_h
#define Coordinate_h

#include<ostream>
using namespace std;
class Coordinate
{
    friend ostream &operator<<(ostream &out,Coordinate &coor);
public:
    Coordinate(int x=0,int y=0);
    ~Coordinate();
    void printCoordinate();    
private:
    int m_ix;
    int m_iy;
};
#endif

Coordinate.cpp

#include"Coordinate.h"
#include<iostream>
using namespace std;
Coordinate::Coordinate(int x,int y)
{
    m_ix=x;
    m_iy=y;
}
Coordinate::~Coordinate()
{

}
void Coordinate::printCoordinate()
{
    cout<<"("<<m_ix<<","<<m_iy<<")"<<endl;
}
ostream &operator<<(ostream &out,Coordinate &coor)
{
    out<<"("<<coor.m_ix<<","<<coor.m_iy<<")"<<endl;
    return out;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值