数据结构——栈——进制转换(c++)

自己做一个总结。

使用栈模板写的,学习自慕课网,感谢!

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>





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值