设计程序,利用栈实现数值转换

二、利用栈实现数值转换,先定义一个栈的顺序存储结构,那么我们需要定义一个结构体,结构体里面有个int类型的数组,还有一个top用来存储栈顶元素的下标。栈是一种基本的数据结构,它遵循先进后出的原则。这意味着最后添加到栈中的元素将会首先被取出。栈通常具有两个主要操作:压栈:将元素添加到栈的顶部。出栈:从栈的顶部移除元素。输入转化之前的数,并且通过进制转化,计算出他的sum,再通过sum来转化成对应的进制,程序运行结果如图2-1。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <stdbool.h>
#define Maxsize 100

// 定义顺序栈的结构体
typedef struct SqStack
{
    int data[Maxsize];// 存储栈中元素的数组
    int top;// 栈顶指针
}SqStack;

// 初始化栈
void Init_Sqstack(SqStack *S)
{
    S->top = -1;// 栈初始化为空,栈顶指针设为-1
}

// 进栈操作
bool push_SqStack(SqStack *S,int x)
{
    if(S->top == Maxsize - 1)
        return false;// 栈满,返回false
    else
        S->data[++S->top] = x;// 元素x进栈,栈顶指针加
    return true;
}

// 出栈操作
bool pop_SqStack(SqStack *S,int *x)
{
    if(S->top == -1)
        return false;// 栈空,返回false
    else
    {
        *x = S->data[S->top];// 将栈顶元素赋值给x
        S->top--;// 栈顶指针减1
    }
    return true;
}

// 展示栈中元素
void show_SqStack(SqStack S)
{
    for(int i = S.top; i >= 0; i--)
    {
        printf("%d ",S.data[i]);// 从栈顶开始打印栈中元素
    }
}

// 将字符数组转换为对应进制的整数
int char_to_num(char *a,int x)
{
    int lenth = strlen(a);// 字符串长度
    int num[100];// 存储转换后的每一位数字
    int sum = 0;// 转换后的整数值
    for(int i = 0; i < lenth; i++)
    {
        if(a[i] >= '0' && a[i] <= '9')// 如果是数字字符,转换为数字
            num[i] = (a[i]-'0');
        else
            num[i] = (a[i]-'A'+10);// 如果是字母字符,转换为对应的数字(A-F为10-15)
    }
    for (int i = 0; i < lenth; i++)
    {
        sum += num[i] * pow(x, lenth - i - 1); // 按权展开求和
    }
    return sum;
}

int main()
{
    SqStack S;
    Init_Sqstack(&S);// 初始化栈  
    
    printf("请输入想要转化前数的进制:");// 提示用户输入原数的进制
    int i;
    scanf("%d",&i);// 读取用户输入的进制 
    
    printf("\n请输入想转化后的进制:");// 提示用户输入目标进制
    int j;
    scanf("%d",&j);// 读取用户输入的目标进制
    
    printf("\n请输入想要转化的数:");// 提示用户输入需要转换的数
    char s[100];
    scanf("%s", s);// 读取用户输入的数
    
    int m;
    m = char_to_num(s,i);// 将字符数组转换为对应进制的整数
    
    // 将整数转换为目标进制的数,并依次入栈 
    while(m)
    {
        push_SqStack(&S,m % j);// 取余数并入栈
        m = m / j;// 整除目标进制数
    }
    
    show_SqStack(S);// 展示栈中元素,即转换后的目标进制数  
    
    return 0;
}

图2-1 进制转化结果图

 

 

  • 19
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是C语言利用实现十进制数值转换为任意进制的代码: ```c #include <stdio.h> #include <stdlib.h> #define STACK_INIT_SIZE 100 #define STACK_INCREMENT 10 typedef struct { int *base; int *top; int stack_size; } Stack; void InitStack(Stack *s) { s->base = (int *)malloc(STACK_INIT_SIZE * sizeof(int)); if (!s->base) exit(1); s->top = s->base; s->stack_size = STACK_INIT_SIZE; } void Push(Stack *s, int data) { if (s->top - s->base >= s->stack_size) { s->base = (int *)realloc(s->base, (s->stack_size + STACK_INCREMENT) * sizeof(int)); if (!s->base) exit(1); s->top = s->base + s->stack_size; s->stack_size += STACK_INCREMENT; } *(s->top) = data; s->top++; } int Pop(Stack *s) { if (s->top == s->base) exit(1); int data = *(s->top - 1); s->top--; return data; } void Conversion(int num, int radix) { Stack s; InitStack(&s); while (num != 0) { Push(&s, num % radix); num /= radix; } while (s.top != s.base) { printf("%d", Pop(&s)); } printf("\n"); } int main() { int num, radix; printf("Please input a number and a radix: "); scanf("%d %d", &num, &radix); Conversion(num, radix); return 0; } ``` 首先定义了一个结构体,包括底指针、顶指针和大小,并实现了初始化、入、出等基本操作。然后定义了一个Conversion函数,该函数接受一个十进制数和一个进制数作为参数,将十进制数转换为目标进制数并输出。具体实现利用结构,将十进制数依次除以目标进制数,将余数依次入,最后依次出并输出即可。在主函数中读入输入参数,调用Conversion函数进行转换

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值