利用栈实现把十进制数转换为二进制至十六进制之间的任一进制数并输出的功能。
【实验题目内容】
利用栈实现把十进制数转换为二进制至十六进制之间的任一进制数并输出的功能。
【实验环境】(使用的软件):VS - 2010
【项目设计源代码】
//stdafx.h头文件即所需的头文件
#include <iostream>
using namespace std;
// linkNode.h单链表的结点类模板头文件
#pragma once
// 单链表的结点
// T为单链表中元素的模板类型
template <class T>
class linkNode
{
public:
// 构造结点
linkNode(void);
// 析构结点
~linkNode(void);
// 元素
T data;
// 后继指针
linkNode<T>* next;
};
// 构造结点
template <class T>
linkNode<T>::linkNode(void)
{
}
// 析构结点
template <class T>
linkNode<T>::~linkNode(void)
{
}
// LinkStack.h链栈类模板头文件
#pragma once
#include "linkNode.h"
// 链栈类模板
// T为链栈中元素的模板类型
template <class T>
class LinkStack
{
public:
// 默认构造函数
LinkStack(void);
// 析构函数
~LinkStack(void);
protected:
// 栈顶指针
linkNode<T>* top;
public:
// 遍历输出链栈
void Print(void);
// 判断栈是否为空
bool IsEmpty(void) const;
// 新元素newData进栈顶,进栈成功,
// 则返回ture,否则,返回false
bool Push(T newData);
// 取栈顶元素topData,取栈顶元素成功,
// 则返回true,否则,返回false
bool GetTop(T& topData);
// 栈顶元素topData出栈,栈顶元素出栈成功,
// 则返回true,否则,返回false
bool Pop(T& topData);
};
// 默认构造函数
template <class T>
LinkStack<T>::LinkStack(void)
{
// 空链栈的栈顶为空
top = NULL;
}
// 析构造函数
template <class T>
LinkStack<T>::~LinkStack(void)
{
linkNode<T>* deleteNode,*current=top;
while(current)
{
deleteNode=current;
current=current->next;
delete deleteNode;
}
top=NULL;
}
// 遍历输出链栈
template <class T>
void LinkStack<T>::Print(void)
{
cout<<"top→";
linkNode<T>* current=top;
while(current!=NULL)
{
cout<<"["<<current->data<<"]";
current=current->next;
if(current!=NULL)
{
cout<<"[-]→";
}
}
cout<<"[^]"<<endl;
}
// 判断栈是否为空
template <class T>
bool LinkStack<T>::IsEmpty(void) const
{
return top==NULL;
}
// 新元素newData进栈顶,进栈成功,
// 则返回ture,否则,返回false
template <class T>
bool LinkStack<T>::Push(T newData)
{
// 动态分配新元素
linkNode<T>* newNode = new linkNode<T>;
if(newNode==NULL)
{
// 内存分配失败
cerr<<"内存分配失败。"<<endl;
return false;
}
// 新元素的数据域更新为newData
newNode->data = newData;
// 原栈顶元素作为新元素的后继
newNode->next = top;
// 新元素成为新栈顶元素
top=newNode;
// 新元素进栈成功,返回true
return true;
}
// 取栈顶元素topData,取栈顶元素成功,
// 则返回true,否则,返回false
template <class T>
bool LinkStack<T>::GetTop(T& topData)
{
if(IsEmpty())
{
// 栈空,无任何元素
return false;
}
// 栈顶元素通过引用形参topData返回
topData = top->data;
// 取栈顶元素成功,返回true
return true;
}
// 栈顶元素topData出栈,栈顶元素出栈成功,
// 则返回true,否则,返回false
template <class T>
bool LinkStack<T>::Pop(T& topData)
{
if(IsEmpty())
{
// 栈空,无栈何元素
return false;
}
// 栈顶元素通过引用形参topData返回
topData = top->data;
// 保存原栈顶指针
linkNode<T>* oldTop = top;
// 栈顶指针后移1个元素
top = top->next;
// 释放原顶元素的空间
delete oldTop;
// 栈顶顶元素出栈成功,返回true
return true;
}
#include "stdafx.h"
#include "LinkStack.h"
int _tmain(int argc, _TCHAR* argv[])
{
system("color F0");
LinkStack<int> linkStack; //创建链栈
int num, base; //十进制数和其需要转换的进制
cout << "输入一个十进制数:";
cin >> num;
cout << "输入你需要转换的进制数:";
cin >> base;
while(!(base == 2 || base == 8 || base == 16)) //确保输入的进制输入正确
{
cout << "输入进制错误,请重新输入:";
cin >> base;
}
int q = -1; //商
int r; //余数
int topData; //接收栈顶元素
while(q != 0) //进栈
{
r = num % base;
linkStack.Push(r);
q = num / base;
num = q;
topData = r;
}
cout << "转换成" << base << "进制数为:";
while(linkStack.Pop(topData))
{
//如果获取的data大于十,说明是十六进制数,要把数转换成字母
if (topData >= 10) {
switch (topData)
{
case 10:
cout << "A";
break;
case 11:
cout << "B";
break;
case 12:
cout << "C";
break;
case 13:
cout << "D";
break;
case 14:
cout << "E";
break;
case 15:
cout << "F";
break;
default:
break;
}
}
else {
cout << topData;
}
}
cout << endl;
return 0;
}
【项目测试运行结果截图】
- 十进制转二进制
- 十进制转八进制
- 十进制转十六进制
- 进制纠错
备注:各位小可爱们如果有任何的疑问可以在评论区留下你的思考,大家一起进步 yo~*