数据结构实践——数制转换

<pre class="cpp" name="code">/* 
* Copyright (c) 2015, 烟台大学计算机与控制工程学院 
* All rights reserved. 
* 文件名称: main.h,1.cpp,2.cpp 
* 作者:唐子健 
* 完成日期:2015年10月9日 
* 版本号:vc++6.0 
* 
* 问题描述:把十进制的整数转换为任一进制数输出。请利用栈设计算法,并实现程序。

 
 
 
#ifndef SQSTACK_H_INCLUDED
#define SQSTACK_H_INCLUDED

#define MaxSize 100
typedef int ElemType;
typedef struct
{
    ElemType data[MaxSize];
    int top;                //栈指针
} SqStack;                  //顺序栈类型定义

void InitStack(SqStack *&s);    //初始化栈
void DestroyStack(SqStack *&s);  //销毁栈
bool StackEmpty(SqStack *s);     //栈是否为空
int StackLength(SqStack *s);  //返回栈中元素个数——栈长度
bool Push(SqStack *&s,ElemType e); //入栈
bool Pop(SqStack *&s,ElemType &e); //出栈
bool GetTop(SqStack *s,ElemType &e); //取栈顶数据元素
void DispStack(SqStack *s);  //输出栈

#endif // SQSTACK_H_INCLUDED
#include <stdio.h>
#include <malloc.h>
#include "sqstack.h"

void InitStack(SqStack *&s)
{
    s=(SqStack *)malloc(sizeof(SqStack));
    s->top=-1;
}
void DestroyStack(SqStack *&s)
{
    free(s);
}
int StackLength(SqStack *s)  //返回栈中元素个数——栈长度
{
    return(s->top+1);
}
bool StackEmpty(SqStack *s)
{
    return(s->top==-1);
}
bool Push(SqStack *&s,ElemType e)
{
    if (s->top==MaxSize-1)    //栈满的情况,即栈上溢出
        return false;
    s->top++;
    s->data[s->top]=e;
    return true;
}
bool Pop(SqStack *&s,ElemType &e)
{
    if (s->top==-1)     //栈为空的情况,即栈下溢出
        return false;
    e=s->data[s->top];
    s->top--;
    return true;
}
bool GetTop(SqStack *s,ElemType &e)
{
    if (s->top==-1)         //栈为空的情况,即栈下溢出
        return false;
    e=s->data[s->top];
    return true;
}

void DispStack(SqStack *s)  //输出栈
{
    int i;
    for (i=s->top;i>=0;i--)
        printf("%c ",s->data[i]);
    printf("\n");
}

void MultiBaseOutput (int number,int base)
{
    //假设number是非负的十进制整数,输出等值的base进制数
    int i;
    SqStack *S;
    InitStack(S);
    while(number)   //从右向左产生base进制的各位数字,并将其进栈
    {
        Push(S,number%base); //将将余数进栈
        number/=base;
    }
    while(!StackEmpty(S))   //栈非空时退栈输出
    {
        Pop(S, i);
        printf("%d",i);
    }
}
int main()
{
    MultiBaseOutput(10, 2);
    return 0;
}


### 数据结构中的数制转换概念 在计算机科学中,不同进制之间的转换是一项基本操作。常见的应用场景包括将十进制数值转换为其他进制表示形式,如八进制、十六进制等。这种转换可以通过多种算法来实现,在数据结构课程里通常会介绍使用栈这一线性表结构来进行此类运算。 #### 辗转相除法简介 对于任意两个正整数N(待转换的十进制数)和r(目标进制),可以采用辗转相除法完成转换过程。具体做法是从被除数N开始不断除以基数r得到商q和余数m;直到某个时刻商变为零为止,则所有产生的余数序列逆序排列即为目标进制下的表达式[^1]。 例如当处理`N=1234`, `r=8`的情况时: | 步骤 | 商 (q) | 余数 (m) | | --- | ------ | -------- | | 初始状态 | 1234 / 8 = 154...2 | m=2 | | | 154 / 8 = 19...2 | m=2 | | | 19 / 8 = 2...3 | m=3 | | 结束 | 2 / 8 = 0...2 | m=2, q=0 | 最终结果应读取自下而上依次连接各步所得之余数:`2322` #### Python代码实例展示 下面给出一段Python程序用于演示如何通过列表模拟栈的行为从而达到相同的效果——即将给定的一个整数num转化为指定的目标进制并返回相应的字符串表示: ```python def convert_to_base(num: int, base: int) -> str: digits = "0123456789ABCDEF" if num < 0: sign = "-" num = abs(num) else: sign = "" stack = [] while num != 0: remainder = num % base stack.append(digits[remainder]) num //= base result = ''.join(reversed(stack)) return f"{sign}{result}" if result else '0' print(convert_to_base(1234, 8)) # 输出:"2322" ``` 此函数接受参数`num`(要转化的原始数字)`base`(期望获得的新进制),内部定义了一个字符集变量digits用来映射大于等于10的小于16的数字到对应的字母A-F之间。如果输入的是负数则先记录符号再对其绝对值做进一步的操作。之后进入循环体直至原数降为零,期间每次迭代都将当前位的结果压入名为stack的数据容器内保存起来等待后续拼接成完整的答案串输出[^2]。 针对特殊情况比如十六进制还需要额外考虑大写字母'A'至'F'[^3]作为可能遇到的有效数码之一加入到最终形成的字符串之中去。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值