前面我们介绍了栈用于括号匹配,本次咱们介绍栈的其他应用。因为栈先进后出的特点,刚好和进制转换数据从后往前读相吻合,所以栈也可以解决进制转换的问题
#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;
}
咱们看一下程序运行的结果