栈:任意进制转换

本题易错的地方为对n的值的判断,分为三种情况:第一种为n大于零,这时可直接进行进制转换运算;第二种为n等于零,此时无论n转换成几进制,输出都为0;

第三种为n小于零,此时可以先把n的值大于零,赋给另一变量,到下面再判断n是否大于零,若大于零则输出“-”。还有一难点为当转换为十一到十六进制是的字母,这一点在程序中表现得很明显了。读者自行判断。

下面是代码:

#include <stdio.h>
#include <stdlib.h>

#define Stack_init_size 1000000
#define Stackincrement 1000000

typedef int Selement;
typedef struct
{
    Selement *base;
    Selement *top;
    int Stacksize;
}Sqstack;

int Initstack(Sqstack *S)//一如既往的初始化
{
    S->base=(Selement *)malloc(Stack_init_size*sizeof(Selement));
    if(!S->base)return -1;
    S->top=S->base;
    S->Stacksize=Stack_init_size;
    return 1;
}

int Push(Sqstack *S,int e)//进栈函数
{
    if(S->top-S->base>S->Stacksize)//判断内存是否充足
    {//若不充足则重新分配内存
        S->base=(Selement *)realloc(S->base,(S->Stacksize+Stackincrement)*sizeof(Selement));
        if(!S->base)return -1;
        S->top=S->base+S->Stacksize;
        S->Stacksize+=Stackincrement;

    }
    *S->top++=e;//此处注意++的位置
    return 1;
}

int Pop(Sqstack *S)//出栈函数
{//用传统方式写在此编译器中不可,另换方法,异曲同工
    int e;
    if(S->base==S->top)return -1;
    e=*--S->top;
    return e;
}

int Emptystack(Sqstack *S)//判断栈是否为空
{
    if(S->base==S->top)return 1;
    else return 0;
}

int Change(Sqstack *S,int n,int r)//转换函数
{
    if(r<2||r>16||r==10)return -1;//判断r输入是否合法
    int i=0,j;//i为标记变量
    int m;//m为n的转换变量
    if(n<0)//判断n的正负
    {
        m=-n;
    }
    else if(n>0)m=n;
    else if(n==0)//不要忘记n为0时的情况
    {
        printf("0");
        return 1;
    }
    while(m)//分解
    {
        Push(S,m%r);
        m=m/r;
    }
    while(!Emptystack(S))
    {//判断栈中是否还有元素

        if(n<0)//判断n的大小,确定输出格式
        {
            if(i==0)//标记变量,标记n
            {
                i=1;
                printf("-");
            }
            j=Pop(S);//直接用此函数不可以,
            //所以先传递给一个整型变量
            if(j>=10)
            {
                printf("%c",j+55);
                //若大于10,则按照转换规则,转换为字符
            }
            else printf("%d",j);
        }
        else
        {
            j=Pop(S);
            if(j>=10)
            {
                printf("%c",j+55);
            }
            else printf("%d",j);
        }
    }
    return 1;
}

int main()
{
    int n,r;
    Sqstack S;

    while(~scanf("%d%d",&n,&r))
    {
        Initstack(&S);
        Change(&S,n,r);
        printf("\n");
    }
    return 0;
}

此代码在codeblocks环境中

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值