十进制N和其它进制数的转换是计算机实现计算的基本问题,其解决方法很多,其中一个简单算法基于下列原理:
N=(n div d)*d+n mod d
( 其中:div为整除运算,mod为求余运算)
例如 (1348)10=(2504)8,其运算过程如下:
不难发现,最后得到的余数2在新的八进制数的最高位(第一位),而最先得到的余数4在新的八进制数的最低位(最后一位)。而我们一般读数是从最高位读起,所以比较简便的做法是将每次取余(mod)得到的余数存储在具有后进先出的特点的结构中,这样只需依次读出余数,便得到了相应的新数制的数。而堆栈刚好具有这样的特点。
使用堆栈进行数制转换的算法如下:
void Conversion(int n,int base)
{
LinkStack *s;
s=InitStack();
int remainder;
while(n!=0){ //进行求模运算,直到n为0时退出循环
remainder=n%base;
Push(s,remainder);
n=n/base;
}
while(s->next!=NULL) //依次弹出栈顶的元素,最终形成的数即为所求进制数
cout<<Pop(s);
cout<<endl;
}
1.使用链栈实现数制转换的完整程序
#include <iostream>
using namespace std;
/*定义链栈的结点类型*/
typedef struct Node
{
int data;
Node *next;
}LinkStack;
int main()
{
LinkStack *InitStack();
void Push(LinkStack *s,int x);
int Pop(LinkStack *s);
void Conversion(int n,int base);
int n,base;
cout<<"请输入需要转换的十进制数:";
cin>>n;
cout<<"请输入新数制的基数:";
cin>>base;
Conversion(n,base);
return 0;
}
/*置空栈:初始化链栈*/
LinkStack *InitStack()
{
LinkStack *s;
s=new LinkStack;
s->next=NULL;
return(s);
}
/*入栈,在栈顶读入数值x*/
void Push(LinkStack *s,int x)
{
LinkStack *p;
p=new LinkStack;
p->data=x;
p->next=s->next;
s->next=p;
}
/*出栈:弹出栈顶元素*/
int Pop(LinkStack *s)
{
LinkStack *q;
int top;
if(s->next==NULL){
cout<<"栈空"<<endl;
return 0;
}
else{
q=s->next;
top=q->data;
s->next=q->next;
delete q;
return(top);
}
}
/*数制转换*/
void Conversion(int n,int base)
{
LinkStack *s;
s=InitStack();
int remainder;
while(n!=0){ //进行求模运算,直到n为0时退出循环
remainder=n%base;
Push(s,remainder);
n=n/base;
}
while(s->next!=NULL) //依次弹出栈顶的元素,最终形成的数即为所求进制数
cout<<Pop(s);
cout<<endl;
}
2.使用顺序栈实现数制转换的完整程序
#include <iostream>
using namespace std;
#define MaxSize 100
/*定义顺序栈的结点类型*/
struct SeqStack
{
int data[MaxSize];
int top;
};
int main()
{
SeqStack *InitStack();
void Push(SeqStack *s,int x);
int Pop(SeqStack *s);
void Conversion(int n,int base);
int n,base;
cout<<"请输入需要转换的十进制数:";
cin>>n;
cout<<"请输入新数制的基数:";
cin>>base;
Conversion(n,base);
return 0;
}
/*置空栈:初始化顺序栈*/
void InitStack(SeqStack *s)
{
s->top=-1;
}
/*入栈,在栈顶读入数值x*/
void Push(SeqStack *s,int x)
{
if(s->top==MaxSize-1)
cout<<"栈已满"<<endl;
else{
s->data[++s->top]=x;
}
}
/*出栈:弹出栈顶元素*/
int Pop(SeqStack *s)
{
int x;
if(s->top==-1){
cout<<"栈已空"<<endl;
return 0;
}
else{
x=s->data[s->top];
s->top--;
return(x);
}
}
/*数制转换*/
void Conversion(int n,int base)
{
SeqStack *s,Stack;
s=&Stack;
InitStack(s);
int remainder;
while(n!=0){ //进行求模运算,直到n为0时退出循环
remainder=n%base;
Push(s,remainder);
n=n/base;
}
while(s->top!=-1) //依次弹出栈顶的元素,最终形成的数即为所求进制数
cout<<Pop(s);
}
注意:
在用顺序栈实现数制转换时,当我如下设置InitStack()函数和Conversion()函数,程序不能正常运行。
/*置空栈:初始化顺序栈*/
SeqStack *InitStack()
{
SeqStack *s,Stack;
s=&Stack;
s->top=-1;
return(s);
}
/*数制转换*/
void Conversion(int n,int base)
{
SeqStack *s;
s=InitStack();
int remainder;
while(n!=0){ //进行求模运算,直到n为0时退出循环
remainder=n%base;
Push(s,remainder);
n=n/base;
}
while(s->top!=-1) //依次弹出栈顶的元素,最终形成的数即为所求进制数
cout<<Pop(s);
}
网上找原因,也有人在使用顺序栈时遇到了这样的问题,看解答,好像跟栈的初始化有关,具体原因暂时还不能完全弄清楚,先将这个问题记在这里。
来源:CSDN
作者:MilkLeong
链接:https://blog.csdn.net/MilkLeong/article/details/104182655