栈应用于进制转换

前面我们介绍了栈用于括号匹配,本次咱们介绍栈的其他应用。因为栈先进后出的特点,刚好和进制转换数据从后往前读相吻合,所以栈也可以解决进制转换的问题


#include<iostream>
using namespace std;
#include<assert.h>
#define ElemType int                    //定义数据元素的类型
#define STACK_SIZE 100                  //栈的大小

typedef struct stack                    //定义一个栈
{
    ElemType *base;
    size_t    capacity;
    int       top;
}stack;

void init_stack(stack *pst)             //初始化栈
{
    pst->base = (ElemType *)malloc(sizeof(ElemType) * STACK_SIZE);
    assert(pst->base != NULL);
    pst->capacity = STACK_SIZE;
    pst->top = 0;
}
void push(stack *pst, ElemType x)       //入栈
{
    if(pst->top >= pst->capacity)
    {
        cout<<"栈已满,"<<x<<"不能入栈"<<endl;
        return;
    }
    pst->base[pst->top++] = x;
}
void pop(stack *pst)                    //出栈
{
    if(pst->top == 0)
    {
        cout<<"栈已空,不能出栈."<<endl;
        return;
    }
    pst->top--;
}
ElemType gettop(stack *pst)             //获取栈顶元素
{
    assert(pst->top != 0);
    return pst->base[pst->top-1];
}
bool empty(stack *pst)                  //判断栈是否为空
{
    return pst->top == 0;
}
void Convert_2(int value)               //转换为二进制
{
    stack st;
    init_stack(&st);
    while(value)                        //若value不为0,循环继续,持续入栈
    {
        push(&st, value%2);
        value /= 2;
    }
    while(!empty(&st))                  //若栈不为空,持续显示栈顶元素并出栈
    {
        cout<<gettop(&st);
        pop(&st);
    }
    cout<<endl;
}

char* Convert_16(int value)            //转换为十六进制
{
    static char buffer[sizeof(int)*2+1]; //由sizeof(int)*8/4 得来+1用来存放'\0'
    for(int i=sizeof(int)*2-1; i>=0; --i)
    {
        buffer[i] = "0123456789ABCDEF"[value%16];   //建立一种映射关系
        value /= 16;
    }
    return buffer;                    //buffer前加有static因此可以作为返回值传递
}

int main()
{
    int value;
    cout<<"input value:>";
    cin>>value;
    cout<<value<<":二进制=";
    Convert_2(value);
    cout<<value<<":十六进制=0x";
    cout<<Convert_16(value)<<endl;
}

咱们看一下程序运行的结果
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值