【C++】定义CMyStack栈,实现栈的各种功能
定义栈CMyStack,该栈能保存指定个数的字符。其功能如下:
1)入栈;
2)出栈;
3)获得栈顶元素;
4)清空栈;
5)判断是否栈空;
6)判断是否栈满。
在实现过程中,自定义相关成员变量和成员函数。
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
//栈的定义
template <class T>
class CMyStack
{
private:
T *m_pData;
int m_iMaxCount;//容量
int m_iCount;//元素个数
public:
CMyStack(int iMaxCount);
~CMyStack();
bool IsEmpty();
bool IsFull();
bool Push(const T &iElement);
bool Pop(T &iElement);
bool clearstack(T &iElement);
bool gettop(T &iElement);
};
template <class T>
CMyStack<T>::CMyStack(int iMaxCount)
{
m_pData = new T[iMaxCount];
m_iMaxCount = iMaxCount;
m_iCount = 0;
}
template <class T>
CMyStack<T>::~CMyStack()
{
delete []m_pData;
}
//判断是否为空
template <class T>
bool CMyStack<T>::IsEmpty()
{
return m_iCount == 0;
}
//判断是否为满
template <class T>
bool CMyStack<T>::IsFull()
{
return m_iCount == m_iMaxCount;
}
//压入栈
template <class T>
bool CMyStack<T>::Push(const T &iElement)
{
if(IsFull())
return false;
m_pData[m_iCount++]=iElement;
printf("Push:%d\n",iElement);
return true;
}
//压出栈
template <class T>
bool CMyStack<T>::Pop(T &iElement)
{
if(IsEmpty())
return false;
iElement=m_pData[--m_iCount];
printf("Pop:%d\n",iElement);
return true;
}
//清空栈
template <class T>
bool CMyStack<T>::clearstack(T &iElement)
{
for(int i=0;i<m_iMaxCount;i++)
{
iElement=0;
m_pData[i]=0;
}
printf("clear\n");
return true;
}
//获得栈顶
template <class T>
bool CMyStack<T>::gettop(T &iElement)
{
if(IsEmpty())
return false;
iElement=m_pData[--m_iCount];
++m_iCount;
printf("Top:%d\n",iElement);
return true;
}
class CA
{
public:
int m_ia;
CA(int ia=0){m_ia = ia;}
};
int main()
{
int i;
CMyStack<int> stack(8);//用CMyStack<int>
while(stack.Push(rand()));
printf("\nIsEmpty? %d, IsFull? %d\n\n",
stack.IsEmpty(),stack.IsFull());
while(stack.Pop(i));
printf("\nIsEmpty? %d, IsFull? %d\n",
stack.IsEmpty(),stack.IsFull());
//CMyStack<CA>测试
printf("======================\n");
CMyStack<CA> st(5);
for(i=0;i<5;i++)
st.Push(CA(i));
CA a;
//获得栈顶
st.gettop(a);
for(i=0;i<5;i++)
{
st.Pop(a);
}
printf("======================\n");
//清空栈
CMyStack<CA> s(5);
for(i=0;i<5;i++)
s.Push(CA(i));
CA a1;
s.clearstack(a1);
for(i=0;i<5;i++)
{
s.Pop(a1);
}
return 0;
}