鱼C论坛

 找回密码
 立即注册
查看: 3533|回复: 3

[已解决]用栈的方法把二进制转化为八进制

[复制链接]
发表于 2017-10-11 17:47:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

#define STACKINITSIZE 20
#define STACKADD 10
typedef char ElemType;
typedef struct
{
        ElemType *base;
        ElemType *top;
        int stackSize;
}sqStack;

void InitStack(sqStack *s)
{
        s->base=(ElemType *)malloc((STACKINITSIZE)*sizeof(ElemType));
        if(!s->base)
        {
                exit(0);
        }
        s->top=s->base;
        s->stackSize=STACKINITSIZE;
} 

void Push(sqStack *s,ElemType e)
{
        if(s->top-s->base>=s->stackSize)
        {
                s->base=(ElemType *)realloc(s->base,(s->stackSize+STACKADD)*sizeof(ElemType));
                if(!s->base)
                {
                        exit(0);
                }
                s->top=s->base+s->stackSize;
                s->stackSize=s->stackSize+STACKADD;
        }
        *(s->top)=e;
        s->top++;
}

void Pop(sqStack *s,ElemType *e)
{
        if(s->base==s->top)
        {
                return;
        }
        *e=*--(s->top);
}

int Stacklen(sqStack s)
{
        return(s.top-s.base);
}

main (void)
{
        sqStack s1,s2;
        ElemType ch; 
        InitStack(&s1);

        printf("请输入二进制数,输入#结束:");
        scanf("%c",&ch);
        while(ch!='#')
        {
                Push(&s1,ch);
                scanf("%c",&ch);
        }
        getchar();
        int i,j,len,sum=0;
        len=Stacklen(s1);
        for(i=0;i<len;i+3)
        {
                sum=0;
                for(j=0;j<3;j++)
                {
                        Pop(&s1,&ch);
                        sum=sum+(ch-'0')*pow(2,j);
                        if(s1.base==s1.top) break;
                }
                Push(&s2,sum+'0');
        }
                InitStack(&s2);
        printf("转换为八进制为:");        
        while(s2.base!=s2.top)
        {
                Pop(&s2,&ch);
                printf("%c",ch);
        }

        return 0;
}

不知道错哪里了,总是运行不了,谁有空可以帮我看看吗
最佳答案
2017-10-20 12:58:41
两个错误

1、main(void), 应该改成int main(void)这种形式
2、你用的是什么编译器或软件?
如果用的linux下编译的话,需要加-lm选项,如:gcc -stack.c -o exe -lm
可以推荐vc++ 6.0开发环境编译应该是没有问题的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-10-20 12:58:41 | 显示全部楼层    本楼为最佳答案   
两个错误

1、main(void), 应该改成int main(void)这种形式
2、你用的是什么编译器或软件?
如果用的linux下编译的话,需要加-lm选项,如:gcc -stack.c -o exe -lm
可以推荐vc++ 6.0开发环境编译应该是没有问题的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-2 16:45:27 | 显示全部楼层
本帖最后由 章鱼张 于 2018-11-2 16:50 编辑

i=3应该是i+=3
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-2 17:22:17 | 显示全部楼层
int main()
{
    sqStack s1, s2;
    ElemType c, result;
    int len, i, j, sum;

    InitStack(&s1);
    InitStack(&s2);

    printf("请输入二进制数,输入#结束:");
    scanf("%c", &c);
    while(c != '#')
    {
        Push(&s1, c);
        scanf("%c", &c);
    }

    getchar();

    len = StackLen(s1);
    printf("栈的当前容量是:%d\n", len);

    for(i = 0; i < len; i+=3)                                                   //注意不是i+3而是i+=3
    {
        sum = 0;                                                                //sum一定要在这初始化
        for(j = 0; j < 3; j++)
        {
            Pop(&s1, &c);
            sum = sum + (c-48) * pow(2, j);                                     //sum会保留原来的值
            if(s1.base == s1.top)
                break;
        }
        result = (char)(sum + 48);                                              //强制类型转换
        Push(&s2, result);
    }

    printf("转化为八进制为:");
    while(s2.base != s2.top)
    {
        Pop(&s2, &result);
        printf("%c", result);
    }

    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-29 22:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表