加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

【数据结构】栈应用之进制转换

发布时间:2020-12-15 06:08:51 所属栏目:安全 来源:网络整理
导读:进制转换就是将十进制数转换成相应的二进制、八进制和十六进制。原理是将十进制模二进制或者八进制或者十六进制所得的余数按从低到高的顺序入栈后,再按从高到底的顺序出栈,就可以将要得到的进制数输出。 #include stdio.h#include stdlib.h#include malloc

进制转换就是将十进制数转换成相应的二进制、八进制和十六进制。原理是将十进制模二进制或者八进制或者十六进制所得的余数按从低到高的顺序入栈后,再按从高到底的顺序出栈,就可以将要得到的进制数输出。

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <stdbool.h>

#define STACK_INIT_SIZE 100 //存储空间初始分配
#define STACKINCREMENT  10  //存储空间非配总量
typedef int SElemType;
typedef int Status;

typedef struct stack
{
    int *base;
    int *top;
    int stacksize;
}Sqstack,*PSqstack;

/***************************************
操作功能:初始化栈
***************************************/
PSqstack Init_stack(PSqstack S)
{
    S->base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));
    if(!S->base)
    {
        printf("内存分配失败n");
        exit(-1);
    }
    S->top = S->base;//不要写成S->base = S->top
    S->stacksize = STACK_INIT_SIZE;
    return S;
}
/*****************************************
操作功能:判断栈是否为空
*****************************************/
bool is_empty(PSqstack S)
{
    if(S->top == S->base)
        return true;
    else
    return false;
}

/*****************************************
操作功能:销毁栈
*****************************************/
int DestroyStack(PSqstack S)
{
    if(!S->base)
        exit(-1);
    S->stacksize = 0;
    free(S->base);
    free(S->top);
    printf("栈销毁成功n");
    return 0;
}
/*****************************************
操作功能:入栈
*****************************************/
int Push(PSqstack S,int e)
{
    if(S->top - S->base >= S->stacksize)
    {
        S->base = (SElemType *)realloc(S->base,(S->stacksize + STACKINCREMENT) * sizeof(SElemType));
        if(!S->base)
        {
            printf("内存分配失败n");
            exit(-1);
        }
        S->top = S->base + S->stacksize;
        S->stacksize += STACKINCREMENT;
    }
    *S->top ++ = e;
    return 0;
}
/********************************************
操作功能:出栈
********************************************/
int Pop(PSqstack S,int *val)
{
    if(S->base == S->top)
    {
        printf("出栈失败");
        exit(-1);
    }
    S->top --;
    *val = *(S->top) ;
    return 0;
}
/********************************************
操作功能:取栈顶元素
********************************************/
int GetTop(PSqstack S,int *val)
{
    if(S->base == S->top)
    {
        printf("出栈失败");
        exit(-1);
    }
    *val = *(S->top -1) ;
    return 0;
}
/********************************************
操作功能:遍历栈
********************************************/
int Traverse(PSqstack S)
{
    int *p,i;
    if(S->top == S->base)
    {
        printf("遍历失败n");
        exit(-1);
    }
    p = S->top - 1;
    while(p >= S->base)
    {
        printf("%d ",*p);
        p--;
    }
    printf("n");
    return 0;
}
/*********************************************
操作功能:十进制转化成二、八、十六进制 
参数说明:S表示一个栈, val_1表示十进制数
          val_2表示要转化的进制数 
*********************************************/
int transfer(PSqstack S,int val_1,int val_2)
{
    int *val;
    while(val_1)//循环,直到n等于0为止 
    {
        Push(S,val_1 % val_2);
        //将val_1 / val_2 的余数入栈,先压入的是低位,后压入的是高位。
        //利用栈的先进后出的特性 
        val_1 = val_1 / val_2; //利用val_1 等于val_1 除以val_2的商进入下一次循环
                               //只要val_1不等于零,就会一直循环  
    } 
    //此时val_1等于0 
    while(!is_empty(S))//利用栈是否为空作为判断条件 
    {
        Pop(S,val);
        //十六进制中,将10~15转换成A~F 
        if(val_2 == 16 && *val >= 10)
        {
            switch(*val)
            {
                case 10:printf("A");break;
                case 11:printf("B");break; 
                case 12:printf("C");break; 
                case 13:printf("D");break; 
                case 14:printf("E");break; 
                case 15:printf("F");break;            
            }             
        }
        
        else 
            printf("%d",*val);   
    } 
    printf("n");
    return 0;    
} 



int main()
{
    unsigned int decimal,X;//decimal表示十进制数,X表示某进制数 
    Sqstack s;
    PSqstack S;
    S =  Init_stack(&s);
    printf("请输入十进制数:n");
    scanf("%u",&decimal);//%u表示无符号十进制数 
    printf("请输入要转换的进制数:");
    scanf("%u",&X);//X表示二进制、八进制、十六进制
   
    transfer(S,decimal,X);
    
    system("pause");
    return 0;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读