鱼C论坛

 找回密码
 立即注册
查看: 1634|回复: 0

[技术交流] 二进制转十进制 栈

[复制链接]
发表于 2019-8-22 09:14:53 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 Halo_Word 于 2019-11-23 11:27 编辑

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

#define STACK_INIT_SIZE 20
#define STACK_INCREMENT 10

typedef char Elemtype ; // 定义为char类型
typedef struct {
    Elemtype *top ; // 类型为指向char类型的指针
    Elemtype *base ;
    int stacksize ; // 当前的栈的容量
} stack ;

void stack_init (stack *s)
{
    s->base = (Elemtype *)malloc(STACK_INIT_SIZE * sizeof(Elemtype)); // 分配空间
    s->top = s->base ; // 此时栈顶就是栈底
    s->stacksize = STACK_INIT_SIZE ; // 栈的容量
}

void push (stack *s , Elemtype e) // 入栈操作
{
    if (s->top - s->base >= s->stacksize)
    {
        s->base = (Elemtype *)realloc(s->base , (STACK_INIT_SIZE + STACK_INCREMENT)*sizeof(Elemtype)); // 重新分配空间
        s->top = s->base + s->stacksize ; // 此时top指针在栈底,因为被重新分配的缘故,所以得推上去原来的栈顶,以便进行对栈的操作
        s->size += increment ; // 扩容
    }
    *(s->top) = e ; // 进行赋值操作
    s->top++ ; // 升一级指针,指向未被注入数据的栈块
}

void pop (stack *s , Elemtype *e) // 出栈操作,这里需要用到c的指针(即*e)
{
    if (s->top == s->base) // 这是空栈的情况
    {
        return ;
    }
    *e = *(--(s->top)) ; // 这里把top指针指向的栈块数据赋值给e,然后top指针降一级,指向最顶的存有数据的栈块
}

int length (stack *s)
{
    return (s->top - s->base) ; // 返回的是有数据的栈块的数目
}

int main ()
{
    stack *s = NULL ;
    s = (stack *)malloc(sizeof(stack));
    Elemtype c ;
    stack_init(s);
    printf("请输入二进制数,输入#代表结束:\n");
    scanf("%c",&c);
    while (c != '#')
    {
        push(s,c);
        scanf("%c",&c);
    }
    int len = length(s);
    printf("栈的当前容量为:%d\n",len);
    int sum = 0 ;
    for (int i = 0 ; i < len ; i++)
    {
        pop(s,&c);
        sum = sum + (c-48) * pow(2,i);
    }
    printf("将二进制转换成十进制的结果:%d\n",sum);
    return 0 ;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-12 04:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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