栈的应用(二进制问题)

使用栈能解决的问题

  1. 将二进制数据转换成十进制数据

1. 将二进制转换成十进制

在计算机内部数据存储都是保存成二进制的形式

而且二进制转换为十进制的公式为 sum(z^n-1) . n表示从二进制后面的位置开始计算.

利用之前定义的过的栈的基本操作实现。

stack_ex1.cpp

添加两个新的头文件string 用来存放输入的字符串
cmath 用来计算幂指数pow

/*
 * 目的: 使用栈的数据结构实现将二进制数据转换成十进制
 * 
 * 思路,将二进制数据塞到栈的结构中,通过访问栈的大小,进行循环遍历对每个出栈的数据2^i数值,同时求和即可
 * 
 * name:ermore
 * email: [email protected]
 * 
 */


#include
#include
#include
#include

typedef  int ElemType; // 取别名 (方便给栈选择不同的数据类型)

const unsigned int StackInitSize = 100; // 初始化每个栈刚开始的容量
const unsigned int StackSizeCre  = 20; // 当栈的容量不能满足使用 需要对栈进行扩容处理

// 定义栈对象
struct Stack
{
    ElemType *base; // 栈底
    ElemType *top;  // 栈顶
    unsigned int StackSize; // 栈可以容纳最大的数据量
};

// 栈的初始化
void init_stack(Stack *sta){
    // 给该栈分配内存(最大容量内存)
    try{
        sta->base = new ElemType[StackInitSize];
        // 必须要保证分配内存成功!(当使用new 分配内存不成功,会抛出异常,所以需要捕捉这个异常!)
        // 当使用new 分配内存不成功时,会抛出 bad_alloc 的异常

    }catch(const std::bad_alloc& e)
    {
        std::cout<<"can,t init stack!";
        return ;
    }

    // 分配内存正常后
    sta->top = sta->base; // 此时空栈 栈顶和栈底对应的位置相同
    sta->StackSize = StackInitSize;
}

// 插入新的元素 在栈顶
void push( Stack &sta , ElemType e){
    
    auto size = sta.top - sta.base;

    // 先判断该栈是否已经满
    if(size == sta.StackSize){
        ElemType *newdata = new ElemType[sta.StackSize+StackSizeCre]; // 此处也需要判断是否分配正常 但是一般情况都分配内存成功,故不做异常检查
        
        auto temp = newdata;
        // 将原来的数据全部拷贝的当前数据中
        for(auto i = sta.base; i!= sta.top; ++i){
            *(temp++) = *i;
        }
        *(temp++) = e;
        delete[] sta.base;
        sta.base = newdata;
        sta.top = temp;
        sta.StackSize = sta.StackSize+StackSizeCre;
    }
    else{
        *(sta.top++) = e;
    }
}


// 删除栈元素(只能删除栈顶的元素)
ElemType* pop(Stack &sta){

    // 先判断是否为空栈
    if(sta.base != sta.top){
        return &*(--sta.top);

    }else{
        std::cout<<"this stack is empty!\n";
        return nullptr;
    }

}


// 返回栈的大小
unsigned int GetSize(Stack &sta){
    return sta.top-sta.base;
}

// 获取栈顶元素的值
ElemType GetTopVal(Stack &sta){
    auto temp = sta.top;
    return *(--temp);
}

// 清空栈
void clean(Stack &sta){
    sta.StackSize = 0;
    delete[] sta.base;
}


// 主函数部分
int main(){

    Stack stack ;
    
    // 初始化栈的数据结构
    init_stack(&stack);

    std::string str;

    std::cout<<"pleace input the  binary num \n";

    if(std::cin >> str){

        // 将输入的字符串放入栈中 
        for(auto i : str){
            if(i=='0' || i == '1'){ // 保证输入是二进制的形式
                push(stack,i-48);
            }else{
                std::cout<<"input not binary num\n";
            }
        }

        int i = 0;
        int sum = 0;

        while(GetSize(stack)){
            sum+=*pop(stack)*pow(2,i++);
        }

        std::cout<<"result: "<

计算结果:

pleace input the  binary num 
11010110
result: 214

将二进制转换成八进制或者十六进制

思路相同:
对于八进制即每三位二进制数值代表一个八进制数值。
对于十六进制即每四位二进制数据代表一个十六进制数值。

同理将二进制放入字符串str中,仅对数据出栈进行修改。

stack_ex1_1.cpp

        // 二进制出栈
        int i = 0;
        int sum = 0;
        Stack result;
        init_stack(&result);

        while(GetSize(stack)){
            if(i == 3) // 八进制的情况
            {
                push(result,sum);
                i=0;
                sum = 0;
            }else{
                sum+=*pop(stack)*pow(2,i);
                i++;
            }
        }
        if(i!=0) push(result,sum);
        std::cout<<"result ";
        while(GetSize(result)){
            std::cout<<*pop(result);

        }
        std::cout<

计算结果:

pleace input the  binary num 
11001001
result 311

代码地址

你可能感兴趣的:(栈的应用(二进制问题))