小泉向西流 发表于 2014-7-9 15:33:14

二进制转换为8进制,

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

#define STACK_INIT_SIZE 20
#define STACKINCREMENT 10    //追加的空间大小
typedef char ElemType;

typedef struct
{
    ElemType *base;       //栈底
    ElemType *top;      //栈顶
    int stackSize;      //栈的容量
}sqStack;

void InitStack(sqStack *s)
{
    s->base=(ElemType *)malloc(STACK_INIT_SIZE*sizeof(ElemType));
    if(*s->base)
    {
         exit(0);
    }
    s->top=s->base;
    s->stackSize=STACK_INIT_SIZE;   //栈的容量
}


void Push(sqStack *s, ElemType e)   //入栈
{
    //如果栈满, 追加空间
    if(s->top-s->base >= s->stackSize)
    {
      s->base=(ElemType *)realloc(s->base,(s->stackSize+STACKINCREMENT)*sizeof(ElemType));
      //realloc追缴空间的函数

      if(!s->base)
            exit(0);
      s->top=s->base+s->stackSize;
      s->stackSize=s->stackSize+STACKINCREMENT;
    }
    *(s->top)=e;
    s->top++;
}

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

void ClearStack(sqStack *s)   //清空栈
{
    s->top=s->base;
}

void DestroyStack(sqStack *s)   //销毁栈
{
    int i, len;
    len=s->stackSize;
    for(i=0;i<len ;i++)
    {
      free(s->base);
      s->base++;
    }
    s->base= s->top= NULL;
    s->stackSize = 0;
}

int StackLen(sqStack s)   //计算栈的当前容量
{
    return(s.top-s.base);
}

int main()
{
    ElemType c, c1='0';
    sqStack s, s1 ;
    int len , len1, i ,j=0;
    InitStack(&s);
    InitStack(&s1);

    printf("请输入二进制数,输入#符号表示结束!\n");
    scanf("%c",&c);
    while(c!='#')
    {
      Push(&s, c);
      scanf("%c",&c);
    }
    getchar();   //清理键盘缓冲区, 清空#

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

    for(i=0;i<len; i++)
    {
      Pop(&s, &c);
      c1=c1+(c-48)*pow(2,j);
      j++;
      if(j==3)
      {
            Push(&s1, c1);
            j=0;
            c1='0';
      }
    }
    if(i==len&&j!=3)
    {
      Push(&s1, c1);
    }

    len1= StackLen(s1);

    printf("新栈的当前容量是%d\n", len1);
    printf("转换为八进制数是:");

    for(i=0;i<len1;i++)
    {
         Pop(&s1, &c);
      printf("%c", c);
    }
    printf("\n");

    return 0;
}

wanmiles 发表于 2014-7-10 22:07:34

强烈支持楼主ing……

Almy 发表于 2014-8-18 11:38:36

好贵啊~~~纠结

一世安 发表于 2014-8-22 21:09:27

非常感谢啊,第20行有个小错,改为 if(!s->base)

hx3718895 发表于 2014-11-7 11:00:57

强烈支持楼主ing……
只是好贵T_T

mrlonely1002 发表于 2014-11-12 10:39:54

没钱啊鱼币人民币 都没有:cry

shisecao 发表于 2014-11-14 22:38:11

鱼哥,我这个穷人消费不起你的课程啊

阿斯顿加扣扣 发表于 2015-2-18 15:25:04

:sad{:1_1:}{:1_1:}{:1_1:}{:1_1:}

jqq 发表于 2015-4-21 08:25:24

慢慢学习!!!

lvss 发表于 2015-4-21 09:11:57

强烈支持楼主ing……

8938 发表于 2015-5-12 22:01:31

{:1_1:}

alexzp 发表于 2015-6-7 23:56:04

有点贵啊:cry

dabaojian 发表于 2015-8-17 11:56:35

八进制和十进制没差太多

怪盗①⒋Ⅻ號 发表于 2015-8-20 18:08:34

来参考一下源代码

minwang 发表于 2015-11-3 19:52:35

辛苦老师

amon91 发表于 2015-11-16 19:51:51

好贵啊啊啊啊

amon91 发表于 2015-11-16 20:28:27

小泉向西流 发表于 2014-7-9 15:33
二进制转换为8进制,

输出不对啊

fzquchs 发表于 2016-2-26 02:29:29

自己写的二进制转换为十六进制作业代码,给各位鱼油参考一下,有更好的也可以分享一下出来
#include <stdio.h>
#include <windows.h>
#include <math.h>

typedef char ElemType;// 元素类型

typedef int Status;
       
#define ERROR                                        0
#define OK                                                1

typedef struct
{
        ElemType *base;   // 在栈构造之前和销毁之后,base 的值为 NULL
        ElemType *top;    // 栈顶指针
        int stackSize;    // 当前已经分配的储存空间,以元素为单位
}sqStack;


#define STACK_INIT_SIZE                        100// 储存空间初始分配量
#define STACK_INCREMENT                        10   // 储存空间分配增量

//初始化一个栈
Status InitStack(sqStack *s)
{
        if( NULL == s)
                return ERROR;

        s->base = (ElemType *)malloc( STACK_INIT_SIZE * sizeof(ElemType) );
        if( !s->base )
                return ERROR;//exit(0);
       
        s->top = s->base;   // 最开始,栈顶就是栈底
        s->stackSize = STACK_INIT_SIZE;

        return OK;
}

//压入栈
Status Push(sqStack *s, ElemType e)
{
        if( NULL == s)
                return ERROR;

        //如果栈满, 追加空间
        if( s->top - s->base >= s->stackSize )
        {
                s->base = (ElemType *)realloc(s->base, (s->stackSize + STACK_INCREMENT)*sizeof(ElemType));
                if( !s->base )
                        return ERROR;//        exit(0);

                s->top = s->base + s->stackSize;//设置栈顶
                s->stackSize = s->stackSize + STACK_INCREMENT; //设置新的容量
        }

        *(s->top) = e; //写入元素
        s->top++; //栈顶上移

        return OK;

}

//弹出栈
Status Pop(sqStack *s, ElemType *e)
{
        if( NULL == s)
                return ERROR;

        if( s->top == s->base )// 栈已空空是也
                return ERROR;
       
        *e = *--(s->top); //先将栈顶下移,然后取出里面的元素

        return OK;
}


//清空栈
Status ClearStack(sqStack *s)
{
        if( NULL == s)
                return ERROR;

        s->top = s->base;
        return OK;
}

//销毁这个栈
Status DestroyStack(sqStack *s)
{
        int i, len;

        if( NULL == s)
                return ERROR;
       
        len = s->stackSize;
       
        for( i=0; i < len; i++ )
        {
                free( s->base );
                s->base++;
        }
       
        s->base = s->top = NULL;
        s->stackSize = 0;

        return OK;
}

//计算栈的当前容量
int StackLen(sqStack s)
{
        return(s.top - s.base);// 初学者需要重点讲解
}

//若栈不空,则用e返回s的栈顶元素,并返回OK,否则返回ERROR
Status GetTop(sqStack s, ElemType *e)
{
        //若栈不空,则用e返回s的栈顶元素,并返回OK;否则返回ERROR
        if( s.base == s.top )
                return ERROR;

        *e = *(s.top-1);
        return OK;
}


int main(int argn, char* argv[], char* arge[])
{
        ElemType c;
        sqStack s, temp;
        int len, i, sum = 0, j;
        int flag; //3次标识

        InitStack(&s);
        InitStack(&temp);

        printf("请输入二进制数,输入#符号表示结束\n");//如输入 11001001#
        scanf("%c", &c);
/*
        请输入要查询的字母:0       
        你输入的字符 0 对应的十进制数为: 48对应的十六进制数为:30
        请输入要查询的字母:1       
        你输入的字符 1 对应的十进制数为: 49对应的十六进制数为:31
*/
        while( c != '#')
        {
                Push(&s,c);
                scanf("%c", &c);
        }

        fflush(stdin); //把\n从缓冲区清除getchar()也可以

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

        flag = 0; // 标识置0

        for( i = 0,j = 0; i < len; i++ )
        {
                Pop(&s,&c);
                sum = sum + (c - 48)*pow(2,j);

                if(flag == 3 || i == (len-1)) //i == (len-1)是防止循环退出前把数据压栈
                {
                        Push(&temp,sum);
                        sum = 0; //清空
                        flag = 0; // 标识置0
                        j = 0; //次方数置0
                }else
                {
                        flag++; //标识递增
                        j++;
                }

               
        }

        printf("转化为十六进制数是:");
       
        len = StackLen(temp);

        for( i = 0; i < len; i++ )
        {
                Pop(&temp,&c);
                printf("%X", c);
        }

        //销毁栈
//        DestroyStack(&s);
//        DestroyStack(&temp);

        printf("\n");

///////////////////////////////////////////////
        system("pause");
        return 0;
}



二进制转换为八进制的代码只要将里面的标识flag改为:flag==2就可以了

newbi110 发表于 2016-8-8 09:37:02

强烈支持楼主ing……~~

c语言的菜鸟 发表于 2016-10-18 15:45:44

强势下载了!!努力赚钱买课件!!!
页: 1 [2] 3
查看完整版本: 第二十五讲 栈和队列3(视频+课件+源代码)