openjudge数据结构练习集 数制转换(栈应用)

本文介绍了一种使用链栈实现从十进制数转换为2到16进制数之间的任意进制数的方法。通过不断除以目标进制并取余数,将得到的余数压入栈中,最后依次弹出栈中的元素即完成转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数制转换(栈应用)

总时间限制: 
1000ms
内存限制: 
65536kB
描述

编程实现:输入两个正整数m和r(2<= r <=16),输出与十进制数m相等的r进制数。大于9的数字依次使用大写字母:A B C D E F

要求:使用链栈来实现,否则成绩记0分。


输入
输入一行,包括两个整数m和r,用空格隔开。1<=m<=9999, 2<=r<=16
输出
与十进制整数m相等的r进制数
样例输入
108 16
样例输出
6C

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

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 20 /*  存储空间初始分配量 */

typedef int Status;
typedef int SElemType;

typedef struct StackNode
{
    SElemType data;
    struct StackNode *next;
}StackNode,*LinkStackPtr;

typedef struct
{
    LinkStackPtr top;
    int count;
}LinkStack;

Status InitStack(LinkStack *S)
{
    S->top = (LinkStackPtr)malloc(sizeof(StackNode));
    if(!S->top)
        return ERROR;
    S->top=NULL;
    S->count=0;
    return OK;
}

Status StackEmpty(LinkStack S)
{
    if (S.count==0)
        return TRUE;
    else
        return FALSE;
}


Status Push(LinkStack *S,SElemType e)
{
    LinkStackPtr s=(LinkStackPtr)malloc(sizeof(StackNode));
    s->data=e;
    s->next=S->top;	/*  把当前的栈顶元素赋值给新结点的直接后继*/
    S->top=s;	 /*  将新的结点 s 赋值给栈顶指针 */
    S->count++;
    return OK;
}

Status Pop(LinkStack *S,SElemType *e)
{
    LinkStackPtr p;
    if(StackEmpty(*S))
        return ERROR;
    *e=S->top->data;
    p=S->top;	/*  将栈顶结点赋值给 p,见图中③ */
    S->top=S->top->next;	/*  使得栈顶指针下移一位,指向后一结点 */
    free(p);	/*  释放结点 p */
    S->count--;
    return OK;
}

Status visit(SElemType c)
{
    printf("%d ",c);
    return OK;
}

Status StackTraverse(LinkStack S)
{
    LinkStackPtr p;
    p=S.top;
    while(p)
    {
        visit(p->data);
        p=p->next;
    }
    printf("\n");
    return OK;
}

int main()
{
    int i=0;
    int m,r;
    int e;
    scanf("%d%d",&m,&r);
    LinkStack s;
    InitStack(&s);
    while(m>0)
    {
        int x=m%r;
        m=m/r;
        Push(&s,x);
    }
    LinkStackPtr p;
    while(!StackEmpty(s))
    {
        Pop(&s,&e);
        if(e<10)
            printf("%d",e);
        else
        {
            switch(e)
            {
                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;
            }
        }
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值