鱼C论坛

 找回密码
 立即注册
楼主: 小甲鱼

第二十五讲 栈和队列3(视频+课件+源代码)

[复制链接]
发表于 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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

发表于 2014-7-10 22:07:34 | 显示全部楼层
强烈支持楼主ing……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-18 11:38:36 | 显示全部楼层
好贵啊~~~纠结
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-22 21:09:27 | 显示全部楼层
非常感谢啊,第20行有个小错,改为 if(!s->base)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-11-7 11:00:57 | 显示全部楼层
强烈支持楼主ing……
只是好贵T_T
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-11-12 10:39:54 | 显示全部楼层
没钱啊  鱼币人民币 都没有:cry
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-11-14 22:38:11 | 显示全部楼层
鱼哥,我这个穷人消费不起你的课程啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-2-18 15:25:04 | 显示全部楼层
:sad{:1_1:}{:1_1:}{:1_1:}{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-4-21 08:25:24 | 显示全部楼层
慢慢学习!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-4-21 09:11:57 | 显示全部楼层
强烈支持楼主ing……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-5-12 22:01:31 | 显示全部楼层
{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-6-7 23:56:04 | 显示全部楼层
有点贵啊:cry
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-8-17 11:56:35 | 显示全部楼层
八进制和十进制没差太多
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-8-20 18:08:34 | 显示全部楼层
来参考一下源代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-11-3 19:52:35 | 显示全部楼层
辛苦老师
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-11-16 19:51:51 | 显示全部楼层
好贵啊啊啊啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-11-16 20:28:27 | 显示全部楼层
小泉向西流 发表于 2014-7-9 15:33
二进制转换为8进制,

输出不对啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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就可以了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-8 09:37:02 | 显示全部楼层
强烈支持楼主ing……~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-18 15:45:44 | 显示全部楼层
强势下载了!!努力赚钱买课件!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-21 20:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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