数据结构:栈实现进制转化

采用链栈, 基本流程为:先将任意进制转化为十进制,再将十进制转化为目标进制, 达到任意进制转化任意进制的功能。

中间函数:将任意进制转化为十进制

int Anysystem_convert_TenSystem(char *s,int n)
{
    int sum=0;
    int num_size= strlen(s);
    for(int k=0;k<num_size;k++)
    {
        if(s[k]>='0'&&s[k]<='9')                 // 处理数字
            sum=sum+(int(s[k]-'0'))*pow(n,num_size-k-1);
        else if(s[k]>='A'&&s[k]<='Z')        // 处理十进制以上的字母
            sum=sum+int(s[k]-55)*pow(n,num_size-k-1);
    }
    return sum;
}

将十进制转化为目标进制:

void Convert_system(LinkStack *p,int N,int n)      // n表示目标进制.
{
    LinkStackNode *ptr=p->top;
    while(N!=0)                     // 余数依次进栈
    {
        Push_LinkstackNode(p,N%n);//入栈
        N/=n;
    }

    while(p->length)
    {
        int data= pop_LinkStack(p);
        if(data>9)                      // 对超过9的数字进行特殊处理。
        {
            data=data+55;
            printf("%c",data);
        }

        else
            printf("%d",data);  // 小于9的数字直接进行输出
    }
}

源代码


#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "math.h"
typedef struct LinkStackNode
{
    int data;
    LinkStackNode *next;
}LinkStackNode;
typedef struct LinkStack
{
    LinkStackNode *top;
    int length;
}LinkStack;
LinkStack *initialize_stack()//链栈的初始化
{
    LinkStack *p = (LinkStack *) malloc(sizeof(LinkStack));
    p->length = 0;
    p->top = NULL;
    return p;
}
void Push_LinkstackNode(LinkStack *p,int data)//入栈 
{
    if(!p) return;
    LinkStackNode *temp=(LinkStackNode *) malloc(sizeof(LinkStackNode));
    temp->data=data;
    temp->next=p->top;
    p->top=temp;
    p->length++;
}
int pop_LinkStack(LinkStack *p)//出栈 
{
    if(!p) return 1;
    int data;
    LinkStackNode *temp=p->top;
    data=temp->data;
    p->top=temp->next;
    p->length--;
    free(temp);
    return data;
}
int Anysystem_convert_TenSystem(char *s,int n)//N代表该数字 n代表进制数 转化为10进制 
{
    int sum=0;
    int num_size= strlen(s);
    for(int k=0;k<num_size;k++)
    {
        if(s[k]>='0'&&s[k]<='9')
            sum=sum+(int(s[k]-'0'))*pow(n,num_size-k-1);
        else if(s[k]>='A'&&s[k]<='Z')
            sum=sum+int(s[k]-55)*pow(n,num_size-k-1);
    }
    return sum;
}
void Convert_system(LinkStack *p,int N,int n)//把十进制数转换为其它 
{
    LinkStackNode *ptr=p->top;
    while(N!=0)
    {
        Push_LinkstackNode(p,N%n);//入栈
        N/=n;
    }
    while(p->length)
    {
        int data= pop_LinkStack(p);
        if(data>9)
        {
            data=data+55;
            printf("%c",data);
        }
        else
            printf("%d",data);
    }
}
int main()
{
    char s[20];
    int N_next,N_ptr,num_ptr,num_next;
    LinkStack *Stack=initialize_stack();
    printf("输入转换之前的进制:");
    scanf("%d",&N_ptr);
    printf("输入转换后的进制:");
    scanf("%d",&N_next);
    printf("请输入你想要转换的数字:");
    scanf("%s",s);
    num_next= Anysystem_convert_TenSystem(s,N_ptr);
    Convert_system(Stack,num_next,N_next);
}

  • 2
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值