鱼C论坛

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

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

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

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

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

x
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<math.h>

  4. #define STACKINITSIZE 20
  5. #define STACKADD 10
  6. typedef char ElemType;
  7. typedef struct
  8. {
  9.         ElemType *base;
  10.         ElemType *top;
  11.         int stackSize;
  12. }sqStack;

  13. void InitStack(sqStack *s)
  14. {
  15.         s->base=(ElemType *)malloc((STACKINITSIZE)*sizeof(ElemType));
  16.         if(!s->base)
  17.         {
  18.                 exit(0);
  19.         }
  20.         s->top=s->base;
  21.         s->stackSize=STACKINITSIZE;
  22. }

  23. void Push(sqStack *s,ElemType e)
  24. {
  25.         if(s->top-s->base>=s->stackSize)
  26.         {
  27.                 s->base=(ElemType *)realloc(s->base,(s->stackSize+STACKADD)*sizeof(ElemType));
  28.                 if(!s->base)
  29.                 {
  30.                         exit(0);
  31.                 }
  32.                 s->top=s->base+s->stackSize;
  33.                 s->stackSize=s->stackSize+STACKADD;
  34.         }
  35.         *(s->top)=e;
  36.         s->top++;
  37. }

  38. void Pop(sqStack *s,ElemType *e)
  39. {
  40.         if(s->base==s->top)
  41.         {
  42.                 return;
  43.         }
  44.         *e=*--(s->top);
  45. }

  46. int Stacklen(sqStack s)
  47. {
  48.         return(s.top-s.base);
  49. }

  50. main (void)
  51. {
  52.         sqStack s1,s2;
  53.         ElemType ch;
  54.         InitStack(&s1);

  55.         printf("请输入二进制数,输入#结束:");
  56.         scanf("%c",&ch);
  57.         while(ch!='#')
  58.         {
  59.                 Push(&s1,ch);
  60.                 scanf("%c",&ch);
  61.         }
  62.         getchar();
  63.         int i,j,len,sum=0;
  64.         len=Stacklen(s1);
  65.         for(i=0;i<len;i+3)
  66.         {
  67.                 sum=0;
  68.                 for(j=0;j<3;j++)
  69.                 {
  70.                         Pop(&s1,&ch);
  71.                         sum=sum+(ch-'0')*pow(2,j);
  72.                         if(s1.base==s1.top) break;
  73.                 }
  74.                 Push(&s2,sum+'0');
  75.         }
  76.                 InitStack(&s2);
  77.         printf("转换为八进制为:");       
  78.         while(s2.base!=s2.top)
  79.         {
  80.                 Pop(&s2,&ch);
  81.                 printf("%c",ch);
  82.         }

  83.         return 0;
  84. }
复制代码


不知道错哪里了,总是运行不了,谁有空可以帮我看看吗
最佳答案
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-4-24 01:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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