美文网首页
栈的应用(二进制问题)

栈的应用(二进制问题)

作者: 不想当社畜 | 来源:发表于2019-03-16 20:51 被阅读0次

    使用栈能解决的问题

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

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

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

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

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

    stack_ex1.cpp

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

    /*
     * 目的: 使用栈的数据结构实现将二进制数据转换成十进制
     * 
     * 思路,将二进制数据塞到栈的结构中,通过访问栈的大小,进行循环遍历对每个出栈的数据2^i数值,同时求和即可
     * 
     * name:ermore
     * email: mzhmzh0109@163.com
     * 
     */
    
    
    #include<iostream>
    #include<stdexcept>
    #include<string>
    #include<cmath>
    
    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: "<<sum<<std::endl;
    
        }else{
            std::cout<<"input fail\n";
            return -1;
        }
      
        return 0;
    }
    

    计算结果:

    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<<std::endl;
    

    计算结果:

    pleace input the  binary num 
    11001001
    result 311
    

    代码地址

    相关文章

      网友评论

          本文标题:栈的应用(二进制问题)

          本文链接:https://www.haomeiwen.com/subject/qhkemqtx.html