通过"栈"-将2进制数转为10进制数(数据结构)

版权声明:本博客为个人原创,转载请注明出处 https://blog.csdn.net/qq_33826564/article/details/81597338

通过-栈-将2进制数转为10进制数(数据结构)

原理


  • 原理比较简单,我们输入一个二进制数(用char[]读取),以 # 结束输入,比方说为 0111# 表示输入二进制数字0111,将这个char[]从下标为0到4依次压入栈中,由于栈有先入后出的特性,所以最后出栈的时候的顺序和入栈的顺序是相反的,根据式
    Decimal(0111)=120+121+122+023=1+2+4=7

    其中 Decimal 表示将一个二进制数转换为十进制的函数。
  • 这里我们使用堆来模拟栈,为的就是要演示这个原理而已,请勿深究。申请堆内存的时候使用malloc,需检查是否申请成功。
  • 需要注意的是不仅要注意栈的上溢出(经常出现在 push 动作),还要注意栈的下溢出(常见于 pop 动作)。栈的上溢出非常有名,经常拿来用作为黑客攻击,粗心的程序员往往忽视栈溢出的情况,而使得黑客有机可乘,通过栈溢出,覆盖原有指令,可以使程序跳转到不可意料的地方,为了防止堆栈溢出,需要在压栈的时候检查时候超过了栈的容量(capacity)。同样的下溢出也是需要避免的,我们在 pop 的时候,要检查是否到了栈底了,如果到了栈底,则没有数据了,也 pop 不了的了,如果这个时候进行 pop,会有意想不到的错误。

代码



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


typedef unsigned char Tp;
#define STACKMAXCAP 10 //栈容量
#define EXPANSIONUNIT 5 //每次栈扩容单位

typedef struct {
    Tp *pBase;//栈底
    Tp *pTop;//栈顶
    int nCap = STACKMAXCAP;//栈容量
}Stack;

void InitStack(Stack *stack)
{
    stack->pTop = (Tp*)malloc( sizeof(Tp) );
    //注意这里,内存申请有可能不成功,需判断
    if (!stack->pTop)
    {
        exit(0);
    }
    stack->pBase = stack->pTop;
}
//计算当前栈大小函数
int SizeOfStack(Stack *stack)
{
    return stack->pBase - stack->pTop;
}
//入栈函数
void PushStack(Stack *stack, Tp data)
{
    //注意这里,为了防止堆栈溢出,如果超出堆栈大小
    //需重新分配堆栈内存
    if (SizeOfStack(stack) > STACKMAXCAP)
    {
        stack->pTop = (Tp*)realloc(stack->pTop, (SizeOfStack(stack)+EXPANSIONUNIT)*sizeof(Tp));
    }
    else
    {
        *(stack->pTop) = data;
        --stack->pTop;
    }
}
//出栈函数
Tp PopStack(Stack *stack)
{
    Tp temp;
    //注意这里,出栈数据并非栈顶指针所指数据,为栈顶 (指针+1) 的那个数据  
    if (stack->pTop ==stack->pBase)
    {
        return 0;
    }
    else
    {
        temp = *(stack->pTop + 1);
        ++stack->pTop;
        return temp;
    }

}

int main()
{
    Stack stack;
    InitStack(&stack);

    printf("please input Binary number: (input '#' to  overinput)\n");
    Tp cTemp;
    while(1)
    {
        cTemp = getchar();
        if ( cTemp!='#' )
        {
            PushStack(&stack, cTemp);       
        }
        else
        {
            break;
        }   
    }
    int dec = 0;
    int i = 0;
    while (1)
    {
        // 注意这里栈顶小于栈底的时候,才是栈有数据的时候
        if (stack.pTop < stack.pBase)
        {
            dec = dec + (PopStack(&stack) - 48)*pow(2, i);      
            ++i;
        }
        else
        {
            break;
        }
    }
    printf("Corresponding Decimal number : %d\n ",dec);
    system("pause");
    return 0;
}

运行结果

这里写图片描述

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页