简单的进制转换器(基于数据结构)

为什么要用栈这种结构

简单的进制转换器(基于数据结构)_第1张图片

在十进制转换为其他进制时,先算的余数由下而上组成的数是最终转换结果,见上图。而栈这种结构中,元素先进后出。符合进制转换的方式,故用栈这种结构。

一.定义声明

#include 
using namespace std;
#define OK 1
#define ERROR 0
typedef int Status;
typedef int ElemType;
//定义结构体:
typedef struct Node
{
     
ElemType data;
struct Node   * next;
}StackNode ,* LinkStack ;
//函数的声明:
Status InitStack ( LinkStack   &s );
Status   Push ( LinkStack   &s , ElemType  e );
Status   Pop ( LinkStack   &s , ElemType  &e );
bool   StackEmpty ( LinkStack   s );
void Conversion(int x,  int r);//x:转换数,r:进制

二.主函数

int main()
{
     int x,r,T;
  while(1)
 {
     
  cout<<"输入转换数和进制:";
  cin>>x>>r;
  if(x==0||r==0)//如果x==0或者r==0退出循环
  {
     
    break;
  }
  else
  {
     
  Conversion( x,   r);
  printf("\n");
  }
 }
}

三.函数部分

Status InitStack ( LinkStack   &s )
{
     
  s=new StackNode;
  if(!s) return ERROR;
  s->next==NULL;
  return OK;
}
//入栈
Status   Push ( LinkStack   &s , ElemType  e )
{
     
  StackNode *p=new StackNode;
  p->data=e;
  p->next=s->next;
  s->next=p;
  return OK;
}
//出栈
Status   Pop ( LinkStack   &s , ElemType  &e )
{
     
  StackNode *p;
  if(s->next==NULL) return ERROR;
  p=s->next;
  e=p->data;
  s->next=p->next;
  delete p;
  return OK;
}
bool   StackEmpty ( LinkStack   s )
{
              
	return  (s->next==NULL);
 }

void Conversion(int x,  int r)   //x:转换数,r:进制      
{
       
    LinkStack s;      ElemType  e;         
    InitStack(s); 
    while  ( x )               
    {
         
	 Push ( s, x % r ) ;  
	 x=x / r ;   
    }      
    while ( ! StackEmpty(s) )    
    {
         
          Pop(s,e);          
          cout<<e;      
    }                                    
}

四.说明

while  ( x )               
    {
         
	 Push ( s, x % r ) ;  
	 x=x / r ;   
    }      

关于对上述代码的解释:
x%r的值(值为x➗r的余数)入栈
十进制转二进制
以202为例。202对先2进行除法运算得出的余数记录在右侧比如:202/2=101余0,用101继续进行除2运算101/2=50余…最后结果从下到上读取:11001010。
简单的进制转换器(基于数据结构)_第2张图片

你可能感兴趣的:(进制转换,栈,数据结构,c++)