数据结构练习——栈(进制转换)

看完小王八老师的数据结构栈的课程,我觉得有必要联系进制转换,写下来记录一下。

数据结构练习——栈(进制转换)C语言实现

首先模拟栈

使用字符串模拟栈,用动态创建的方法模拟栈结构比较好,但是我是数据结构小白,所以见笑了。

下面贴上我的c工程里的头文件中栈的代码:

//定义栈
struct Stack
{
    char mData[100];
    int mLen;
};


//初始化栈
void InitStack(struct Stack *S)
{
    S->mLen = -1;
}
//元素入栈
void Push(struct Stack *S,char item)
{
    S->mData[++S->mLen] = item;
}
//元素出栈
char Pop(struct Stack *S)
{
    return S->mData[S->mLen--];
}
//返回栈顶元素
char  Top(struct Stack *S)
{
    return S->mData[S->mLen];
}
//清空栈
void Clear(struct Stack *S)
{
    int i;
    for(i = 0;i<=S->mLen;i++)
    {
        Pop(S);
    }
}
//是否为空 是空返回1 否则返回0
int StackEmpty(struct Stack *S)
{
    if(S->mLen == -1)
        return 1;
    else
        return 0;
}

 接下来贴图说明一下,几种进制转换实现方法:

十进转八进:

void converse_Dec_to_Oct()   //十进制转八进制
{
    int N;
    char e;
    struct Stack S;
    InitStack(&S);
    printf("Decimal to Octonary(8) please input data:\n");
    scanf("%d",&N);
    //转换
    while(N)
    {
        Push(&S,(char)(N%8+48));
        N = N/8;
    }
    //输出
    printf("converse:");
    while(!StackEmpty(&S))
    {
        e = Pop(&S);
        printf("%c",e);
    }

}

 二进制转十进制:

void converse_bin_to_Dec()  //二进制转换十进制,使用一个栈
{
    struct Stack s;
    InitStack(&s);
    char str[100];
    int outcome=0;    //记录结果
    int i;

    printf("binary to Decimal(10) please input data:\n");
    scanf("%s",str);
    // 压入栈
    for(i=0;i<strlen(str);i++)
    {
        Push(&s,str[i]);
    }
    //转换
    for(i=0;!StackEmpty(&s);i++)
    {
        outcome += (int)(Pop(&s)-48)*pow(2,i);  //字符转int
    }
    //输出
    printf("converse:");
    printf("%d",outcome);
}

 二进制转换八进制:

 可以看到,二进制的3位转换为8进制的1位,所以将二进制串按照3为一个组,转换为8进制的一位压入8进制栈中。

而且此处体现出栈的特点FILO(First In Last Out),转换完成后输出8进制栈的时候正好是各位顺序正确的8进制数。

 注意有时候会有不足二进制栈剩余三位的情况,需要稍微处理一下,上代码:

void converse_bin_to_Oct()  //二进制转换八进制,使用两个栈
{
    struct Stack s,t;
    int temp=0;
    char str[100];
    InitStack(&s);InitStack(&t);
    int i;

    printf("binary to octonary(8) please input binary data:\n");
    scanf("%s",str);
    // binary元素压入栈
    for(i=0;i<strlen(str);i++)
    {
        Push(&s,str[i]);
    }
    //转换
    while(!StackEmpty(&s))
    {
        temp=0; //每次循环执行时temp置0
        for(i=0;i<3&&!StackEmpty(&s);i++)   //当读取三位binary或者binary栈为空时跳出
        temp += (int)(Pop(&s)-48)*pow(2,i);

        Push(&t,(char)(temp+48));  //转换后的8进制数压入8进制栈
    }
    //输出8进制栈
    printf("converse:");
    while(!StackEmpty(&t))
    {
        printf("%c",Pop(&t));
    }
}

二进制转换十六进制:

原理和8进制一样,不赘述了,但是注意十六进制使用A-F表示10-15:

void converse_bin_to_Hex()  //二进制转换十六进制,使用两个栈
{
    struct Stack s,t;
    int temp=0;
    char str[100];
    InitStack(&s);InitStack(&t);
    int i;

    printf("binary to Hexadecimal(16) please input data:\n");
    scanf("%s",str);
    // binary元素压入栈
    for(i=0;i<strlen(str);i++)
    {
        Push(&s,(int)(str[i]-48));
    }
    //转换
    while(!StackEmpty(&s))
    {
        temp=0; //每次循环执行时temp置0
        for(i=0;i<4&&!StackEmpty(&s);i++)   //当读取三位binary或者binary栈为空时跳出
        temp += Pop(&s)*pow(2,i);
        if(temp<=9)
            Push(&t,(int)(temp+48));  //转换后的8进制数压入8进制栈
        else
        {
            switch(temp)
            {
                case 10:Push(&t,'A');break;
                case 11:Push(&t,'B');break;
                case 12:Push(&t,'C');break;
                case 13:Push(&t,'D');break;
                case 14:Push(&t,'E');break;
                case 15:Push(&t,'F');break;
            }
        }
    }

    //输出16进制栈
    printf("converse:");
    while(!StackEmpty(&t))
    {
        printf("%c",Pop(&t));
    }
}

 

下面贴上整个main.c代码,头文件在上面贴出来了。

#include <stdio.h>
#include <stdlib.h>
#include "head.h"
#include <math.h>
#include <string.h>

// 栈使用字符串模拟
void converse_Dec_to_Oct()   //十进制转八进制
{
    int N;
    char e;
    struct Stack S;
    InitStack(&S);
    printf("Decimal to Octonary(8) please input data:\n");
    scanf("%d",&N);
    //转换
    while(N)
    {
        Push(&S,(char)(N%8+48));
        N = N/8;
    }
    //输出
    printf("converse:");
    while(!StackEmpty(&S))
    {
        e = Pop(&S);
        printf("%c",e);
    }

}

void converse_bin_to_Dec()  //二进制转换十进制,使用一个栈
{
    struct Stack s;
    InitStack(&s);
    char str[100];
    int outcome=0;    //结果
    int i;

    printf("binary to Decimal(10) please input data:\n");
    scanf("%s",str);
    // 压入栈
    for(i=0;i<strlen(str);i++)
    {
        Push(&s,str[i]);
    }
    //转换
    for(i=0;!StackEmpty(&s);i++)
    {
        outcome += (int)(Pop(&s)-48)*pow(2,i);  //字符转int
    }
    //输出
    printf("converse:");
    printf("%d",outcome);
}

void converse_bin_to_Oct()  //二进制转换八进制,使用两个栈
{
    struct Stack s,t;
    int temp=0;
    char str[100];
    InitStack(&s);InitStack(&t);
    int i;

    printf("binary to octonary(8) please input binary data:\n");
    scanf("%s",str);
    // binary元素压入栈
    for(i=0;i<strlen(str);i++)
    {
        Push(&s,str[i]);
    }
    //转换
    while(!StackEmpty(&s))
    {
        temp=0; //每次循环执行时temp置0
        for(i=0;i<3&&!StackEmpty(&s);i++)   //当读取三位binary或者binary栈为空时跳出
        temp += (int)(Pop(&s)-48)*pow(2,i);

        Push(&t,(char)(temp+48));  //转换后的8进制数压入8进制栈
    }
    //输出8进制栈
    printf("converse:");
    while(!StackEmpty(&t))
    {
        printf("%c",Pop(&t));
    }
}

void converse_bin_to_Hex()  //二进制转换十六进制,使用两个栈
{
    struct Stack s,t;
    int temp=0;
    char str[100];
    InitStack(&s);InitStack(&t);
    int i;

    printf("binary to Hexadecimal(16) please input data:\n");
    scanf("%s",str);
    // binary元素压入栈
    for(i=0;i<strlen(str);i++)
    {
        Push(&s,(int)(str[i]-48));
    }
    //转换
    while(!StackEmpty(&s))
    {
        temp=0; //每次循环执行时temp置0
        for(i=0;i<4&&!StackEmpty(&s);i++)   //当读取三位binary或者binary栈为空时跳出
        temp += Pop(&s)*pow(2,i);
        if(temp<=9)
            Push(&t,(int)(temp+48));  //转换后的8进制数压入8进制栈
        else
        {
            switch(temp)
            {
                case 10:Push(&t,'A');break;
                case 11:Push(&t,'B');break;
                case 12:Push(&t,'C');break;
                case 13:Push(&t,'D');break;
                case 14:Push(&t,'E');break;
                case 15:Push(&t,'F');break;
            }
        }
    }

    //输出16进制栈
    printf("converse:");
    while(!StackEmpty(&t))
    {
        printf("%c",Pop(&t));
    }
}

int main()
{
    int choose=0;
    printf("which conversion do want to choose:\n10 ot 8:1\n2 to 10:2\n2 to 8: 3\n2 to 16:4\n\ninput: ");
    scanf("%d",&choose);
    fflush(stdin);
    switch(choose)
    {
        case 1:converse_Dec_to_Oct();
        case 2:converse_bin_to_Dec();
        case 3:converse_bin_to_Oct();
        case 4:converse_bin_to_Hex();
    }

    printf("\nHello world!\n");
    return 0;
}

 数据结构小白,有不对的地方,请大佬指出,谢谢!

 

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:技术黑板 设计师:CSDN官方博客 返回首页

打赏作者

地址ch3nye.top

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值