使用栈完成十进制转其他进制的进制转换功能

题解主程序:

#include<myhead.h>
#include"stack.h"

// 数值转换
void Conversion(int num, int base)
{
    stack_ptr s;
    int x;
    s = create_stack();
    while (num > 0)
    {
        x = num % base;
        stack_push(s,x);
        num /= base;
    }
    printf("转换成%d进制为:", base);
    while (!stack_empty(s))
    {
        x = stack_pop(s);
        if (x < 10)     // 数字小于10输出1到10
            x += 48;
        else            //输出ABCDE
            x += 55;
        putchar(x);
    }
    stack_destroy(s);
    printf("\n");
}
int main(void)
{
    int num, base;
    printf("请输入需要数制转换的十进制数:");
    scanf("%d", &num);
    printf("请输入要转换的进制数:");
    scanf("%d", &base);
    Conversion(num, base);
    return 0;
}

头文件:

#ifndef STACK_H
#define STACK_H

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define STACK_SIZE 10
typedef int datatype;

typedef struct stack_node
{
    datatype *data;
    int top;
} stack_node, *stack_ptr;

//创建栈
stack_ptr create_stack(void);

//判空
int stack_empty(stack_ptr S);

//判满
int stack_full(stack_ptr S);

//入栈
int stack_push(stack_ptr S, datatype data);

//出栈
datatype stack_pop(stack_ptr S);

//打印栈
void print_stack(stack_ptr S);

// 获取栈顶元素
datatype *get_top(stack_ptr S);

//销毁栈
void stack_destroy(stack_ptr S);

#endif

资源函数:

#include "stack.h"
// 创建栈
stack_ptr create_stack(void)
{
    // 在堆区申请空间
    stack_ptr S = (stack_ptr)malloc(sizeof(stack_node));
    if (NULL == S)
    {
        printf("分配失败\n");
        return NULL;
    }
    S->data = (datatype *)malloc(sizeof(datatype) * STACK_SIZE);
    if (NULL == S->data)
    {
        printf("分配失败\n");
        return NULL;
    }
    bzero(S->data, sizeof(datatype) * STACK_SIZE);
    S->top = -1;
    printf("创建成功\n");
    return S;
}

// 判空
int stack_empty(stack_ptr S)
{
    return S->top == -1;
}

// 判满
int stack_full(stack_ptr S)
{
    return S->top == STACK_SIZE - 1;
}

// 入栈
int stack_push(stack_ptr S, datatype data)
{
    if (NULL == S || stack_full(S))
    {
        printf("栈已满\n");
        return -1;
    }
    S->top++;
    S->data[S->top] = data;
    printf("%d入栈成功\n", data);
    return 0;
}
// 出栈
datatype stack_pop(stack_ptr S)
{
    if (NULL == S || stack_empty(S))
    {
        printf("栈为空\n");
        return -1;
    }
    // 出栈逻辑:先弹后减
    //printf("%d\t出栈成功\n", S->data[S->top]);
    datatype top =  S->data[S->top];
    S->top--;
    return  top;
}

// 打印栈
void print_stack(stack_ptr S)
{
    if (NULL == S || stack_empty(S))
    {
        printf("栈为空\n");
        return;
    }
    printf("从栈顶到栈底的元素分别是:\n");
    for (int i = S->top; i >= 0; i--)
    {
        printf("%d\t", S->data[i]);
    }
    putchar(10);
    return;
}

// 获取栈顶元素
datatype *get_top(stack_ptr S)
{
    if (NULL == S || stack_empty(S))
    {
        printf("栈为空\n");
        return;
    }
    return &S->data[S->top];
}

// 销毁栈
void stack_destroy(stack_ptr S)
{
    if (S != NULL)
    {
        free(S->data);
        S->data = NULL;
    }
    free(S);
    S = NULL;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值