栈的基本操作在上一篇已经提到,这里就不做详细的说明了。
要想实现对于一个非负十进制整数转换为不大于十进制的数的方法有很多,其中一个基于栈的先进后出的固有特性实现的。在进行进制转换的过程中,由于基于公式:N=(N div d)*d+N mod d(其中:div为整除运算,mod为求余运算)的计算过程是从低位到高位顺序产生所要转换进制数的各个数位,而输出的时候是按从高位到低位进行,恰好与计算过程相反。因此,若将计算过程中得到的进制数的各位顺序进栈,则按出栈序列输出即为你所得到的所转换的进制数。
下面就是利用栈实现进制转换函数的代码
<span style="font-size:18px;">//进制转换函数
void conversion(int n,int r)
{
SqStack S;//构建一个栈
InitStack(S);
while(n)
{
Push(S,n%r);//数据入栈
n=n/r;
}
while(!StackEmpty(S))
{
SElemType e;
Pop(S,e);//数据出栈
cout<<e;
}
cout<<endl;
}</span>
在主函数中只需输入你所要转换的数和转换进制(不大于十进制),然后调用进制转换函数实现转换。整个代码需要用到栈的基本操作为:1构造一个空栈,2判断栈是否为空,7出栈,8进栈。因此整个代码为:
<span style="font-size:18px;">#include <iostream>
using namespace std;
//两个C语言的头文件库
#include <malloc.h>
#include <stdlib.h>
//以下是宏定义
#define OK 1
#define ERROW 0
#define OVERFLOW -2
#define TRUE 1
#define FALSE 0
#define INFEASIBLE -1
#define STACK_INIT_SIZE 100//存储空间初始分配量
#define STACKINCREMENT 10//存储空间分配增量
//以下是类型重新定义
typedef int SElemType;//重新定义SElemType为int型
typedef int Status;//重新定义Status为int型
//下面的是栈的定义和基本操作
typedef struct{//重新定义SqStck为结构类型
SElemType *base;//栈底指针
SElemType *top;//栈顶指针
int stacksize;//栈的当前可使用的最大容量
}SqStack;
//1构造一个空栈
Status InitStack(SqStack &S)
{
S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!S.base)
{
exit(OVERFLOW);//存储分配失败
}
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}
//2判断栈是否为空
Status StackEmpty(SqStack S)
{
if(S.base==S.top)
{
return TRUE;
}
else
{
return FALSE;
}
}
//7出栈
Status Pop(SqStack &S,SElemType &e)
{
if(S.top==S.base)
{
return ERROW;
}
e=*--S.top;
return OK;
}
//8进栈
Status Push(SqStack &S,SElemType e)
{
if(S.top-S.base>=S.stacksize)
{
//栈满追加存储空间
SElemType *newbase=(SElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!newbase)
{
exit(OVERFLOW);
}
S.base=newbase;
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
return OK;
}
//进制转换函数
void conversion(int n,int r)
{
SqStack S;//构建一个栈
InitStack(S);
while(n)
{
Push(S,n%r);//数据入栈
n=n/r;
}
while(!StackEmpty(S))
{
SElemType e;
Pop(S,e);//数据出栈
cout<<e;
}
cout<<endl;
}
//主函数
int main()
{
int n1;
int r1;
cout<<"输入你所要进行转换的十进制数据:";
cin>>n1;
cout<<"输入你所要进行转换的进制数:";
cin>>r1;
conversion(n1,r1);
return 0;
}</span>
例如输入一个非负的十进制数据255,要转换为二进制数,则输出的结果为: