自己做一个总结。
使用栈模板写的,学习自慕课网,感谢!
demo.cpp
<span style="font-size:12px;color:#000000;">#include <iostream>
#include "MyStack.h"
using namespace std;
int main()
{
char num[] = { "0123456789ABCDEF" };
MyStack<int> *pStack = new MyStack<int>(10);
int n,m,mod=0;
cout << "输入需要转换的数" << endl;
cin >> n;
cout << "请输入需要转换的进制" << endl;
cin >> m;
while (n != 0)
{
mod = n%m;
pStack->push(mod);
n = n / m;
}
int elem;
//pStack->stackTravers(false);//如果小于10进制可以这样输出
while (!pStack->stackEmpty())
{
pStack->pop(elem);
cout << num[elem];
}
cout << endl;
}
</span>
栈模板,.cpp和.h分开写的,有的编译器不支持,可以合并到.h里
MyStack.h
<span style="font-size:12px;color:#000000;">#include "MyStack.h"
#include <iostream>
using namespace std;
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 stackTravers(bool change); //遍历栈中所有元素
private:
T *m_stack; //栈空间指针
int m_iSize; //栈容量
int m_iTop; //栈顶,栈中元素数量
};</span><span style="color:#000000;">
</span>
MyStack.cpp
<span style="font-size:12px;color:#000000;">#include "MyStack.h"
#include <iostream>
using namespace std;
template <typename T>//每一个函数前面都要加
MyStack<T>::MyStack(int size)
{
m_iSize = size;
m_stack = new T[size];
m_iTop = 0;//当前的栈是一个空栈,空栈,栈顶为零
}
template <typename T>
MyStack<T>::~MyStack()
{
delete[]m_stack;//释放数组的内存
}
template <typename T>
bool MyStack<T>::stackEmpty()
{
if (0 == m_iTop)//更加高质量
{
return true;
}
return false;
}
template <typename T>
bool MyStack<T>::stackFull()
{
if (m_iTop == m_iSize)//写成>=一样
{
return true;
}
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>::push(T elem)//一定要放在栈顶
{
if (stackFull())
{
//可以用throw来抛出异常
return false;
}
m_stack[m_iTop] = elem;
m_iTop++;//此时栈顶指向的是一个空位置
return true;
}
template <typename T>
bool MyStack<T>::pop(T &elem)//传入的是一个引用
{
if (stackEmpty())
{
return false;
}
m_iTop--;//将栈顶降低至实际的栈顶
elem = m_stack[m_iTop];
return true;
}
//void MyStack::stackTravers(visit())复杂的栈需要一个函数做指针来遍历
template <typename T>
void MyStack<T>::stackTravers(bool change)
{
if (change == true)//栈底到栈顶
{
for (int i = 0; i < m_iTop; i++)
{
//m_stack[i].Coorprint();
cout << m_stack[i];
}
}
else
{
for (int i = m_iTop-1; i >=0; i--)
{
//m_stack[i].Coorprint();
cout << m_stack[i];
}
}
}
</span>