Evolution.Era 发表于 2017-10-11 17:47:22

用栈的方法把二进制转化为八进制

#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;
}

不知道错哪里了,总是运行不了,谁有空可以帮我看看吗{:10_266:}{:10_266:}{:10_266:}{:10_266:}

weizhongyang 发表于 2017-10-20 12:58:41

两个错误

1、main(void), 应该改成int main(void)这种形式
2、你用的是什么编译器或软件?
如果用的linux下编译的话,需要加-lm选项,如:gcc -stack.c -o exe -lm
可以推荐vc++ 6.0开发环境编译应该是没有问题的

章鱼张 发表于 2018-11-2 16:45:27

本帖最后由 章鱼张 于 2018-11-2 16:50 编辑

i=3应该是i+=3

章鱼张 发表于 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;
}
页: [1]
查看完整版本: 用栈的方法把二进制转化为八进制