您的位置:首页 > 理论基础 > 数据结构算法

数据结构之【栈】以及【模板类】基础练习

2017-01-15 17:10 239 查看
用模板的方法实现一个通用的栈类

注意:为了保证模板的通用性,遍历类的时候需要重载运算符<<

#include<iostream>
#include<string>
#include<stdlib.h>
using namespace std;

/**********************************************/
/*
栈  模板类
要求:
MyStack(int size);//分配内存,初始化空间,设定栈容量
~MyStack();//回收栈空间内存
bool stackEmpty();//判定栈是否为空,空返回true,否则返回false
bool stackFull();//判定栈是否满,满返回true,否则返回false
void clearStack();//清空栈
int stackLEngth();//返回元素的个数
void push(char elem);//元素入栈,栈顶上升
char pop(char&elem);//元素出栈,栈顶下降
void stackTraverse();//遍历栈中所有元素

目的:掌握栈的实现原理和运行机制

*/
/********************************/

class Coordinate
{
friend ostream& operator<<(ostream&out,Coordinate coor);
public:
Coordinate(int x=1, int y=2) :m_iX(x), m_iY(y){}
private:
int m_iX;
int m_iY;

};
ostream& operator<<(ostream&out, Coordinate coor)
{
out << "(" << coor.m_iX << "," << coor.m_iY << ")" << endl;

return out;
}

template<typename T>
class MyStack
{
public:
MyStack(int size);//分配内存,初始化空间,设定栈容量
~MyStack();//回收栈空间内存
bool stackEmpty();//判定栈是否为空,空返回true,否则返回false
bool stackFull();//判定栈是否满,满返回true,否则返回false
void clearStack();//清空栈
int stackLength();//返回元素的个数
bool push(T elem);//元素入栈,栈顶上升
bool pop(T&elem);//元素出栈,栈顶下降
void stackTraverse(bool isFromButton);//遍历栈中所有元素

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;
m_pBuffer = NULL;
}
template<typename T>

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

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

return m_iTop;
}
template<typename T>

bool MyStack<T>::stackFull()
{
if (m_iTop >= m_iSize)
{
return true;
}
else
{
return false;
}
}

//push和pop函数能够反映栈机制
template<typename T>

bool MyStack<T>::push(T element) //放到栈顶
{
if (stackFull())
{
return false;
}
else
{
m_pBuffer[m_iTop] = element;
m_iTop++;
return true;
}

}

//char myStack::pop()
//{
//  if (stackEmpty())
//  {
//      return 1;
//  }
//  else
//  {
//      m_iTop--;
//      return m_pBuffer[m_iTop];
//  }
//
//}

template<typename T>
bool MyStack<T>::pop(T &elem)
{
if (stackEmpty())
{
return false;
}
else
{
//elem = m_pBuffer[m_iTop];//当前m_iTop为空
m_iTop--;
elem = m_pBuffer[m_iTop];

return true;
}
}

template<typename T>
void MyStack<T>::stackTraverse(bool isFromButton)
{
if (isFromButton)
{

for (int i = 0; i < m_iTop; i++)
{
cout << m_pBuffer[i] << ",";
}
}
else
{
for (int i = m_iTop--; i >= 0; i--)
{
cout << m_pBuffer[i] << ",";
}
}
cout << endl;
}

void funtest1()
{
MyStack<Coordinate> *pStack = new MyStack<Coordinate>(5);

if (pStack->stackEmpty())
{
cout << "栈为空" << endl;
}

pStack->push(Coordinate(1,2));
pStack->push(Coordinate(3,4));
pStack->push(Coordinate(5,6));
pStack->push(Coordinate(7,8));

pStack->stackTraverse(true);

pStack->clearStack();
pStack->stackTraverse(true);

delete pStack;
pStack = NULL;

}

int main()
{
funtest1();
system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: