栈和队列(一)——栈的实践(2)——数制转换

    /*
    *Copyright (c) 2015 , 烟台大学计算机学院
    *All right resvered .
    *文件名称: 数制转换.cpp
    *作    者: 郑兆涵
    *栈和队列(一)——栈的实践(2)——数制转换
    */

问题:把十进制的整数转换为任一进制数输出。请利用栈设计算法,并实现程序。


编程代码:

//头文件:sqstack.h,包含定义顺序栈数据结构的代码、宏定义、要实现算法的函数的声明
#ifndef SQSTACK_H_INCLUDED
#define SQSTACK_H_INCLUDED
#define MaxSize 100
typedef int ElemType;
typedef struct
{
    ElemType data[MaxSize];
    int top;                //栈指针
} SqStack;                  //顺序栈类型定义
void InitStack(SqStack *&s);    //初始化栈
void DestroyStack(SqStack *&s);  //销毁栈
bool StackEmpty(SqStack *s);     //栈是否为空
int StackLength(SqStack *s);  //返回栈中元素个数——栈长度
bool Push(SqStack *&s,ElemType e); //入栈
bool Pop(SqStack *&s,ElemType &e); //出栈
bool GetTop(SqStack *s,ElemType &e); //取栈顶数据元素
void DispStack(SqStack *s);  //输出栈
#endif // SQSTACK_H_INCLUDED


 //源文件:sqstack.cpp,包含实现各种算法的函数的定义
#include <stdio.h>
#include <malloc.h>
#include "sqstack.h"
void InitStack(SqStack *&s)
{
    s=(SqStack *)malloc(sizeof(SqStack));
    s->top=-1;
}
void DestroyStack(SqStack *&s)
{
    free(s);
}
int StackLength(SqStack *s)  //返回栈中元素个数——栈长度
{
    return(s->top+1);
}
bool StackEmpty(SqStack *s)
{
    return(s->top==-1);
}
bool Push(SqStack *&s,ElemType e)
{
    if (s->top==MaxSize-1)    //栈满的情况,即栈上溢出
        return false;
    s->top++;
    s->data[s->top]=e;
    return true;
}
bool Pop(SqStack *&s,ElemType &e)
{
    if (s->top==-1)     //栈为空的情况,即栈下溢出
        return false;
    e=s->data[s->top];
    s->top--;
    return true;
}
bool GetTop(SqStack *s,ElemType &e)
{
    if (s->top==-1)         //栈为空的情况,即栈下溢出
        return false;
    e=s->data[s->top];
    return true;
}

void DispStack(SqStack *s)  //输出栈
{
    int i;
    for (i=s->top;i>=0;i--)
        printf("%c ",s->data[i]);
    printf("\n");
}


//编写main函数,进行测试。
#include <stdio.h>
#include "sqstack.h"
void MultiBaseOutput (int number,int base)
{
    //假设number是非负的十进制整数,输出等值的base进制数
    int i;
    SqStack *S;
    InitStack(S);
    while(number)   //从右向左产生base进制的各位数字,并将其进栈
    {
        Push(S,number%base); //将将余数进栈
        number/=base;
    }
    while(!StackEmpty(S))   //栈非空时退栈输出
    {
        Pop(S, i);
        printf("%d",i);
    }
}
int main()
{
    MultiBaseOutput(10, 2);
    return 0;
}

输出结果:



  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,根据的基本操作,可以先将要转换的数不断除以进数,将余数依次入,然后依次出,得到的数就是转换后的结果。以下是示例代码: ``` #include <stdio.h> #include <stdlib.h> #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 typedef struct { int *base; int *top; int stacksize; } SqStack; // 初始化 void InitStack(SqStack *s) { s->base = (int *) malloc(STACK_INIT_SIZE * sizeof(int)); if (!s->base) exit(0); s->top = s->base; s->stacksize = STACK_INIT_SIZE; } // 入 void Push(SqStack *s, int e) { if (s->top - s->base >= s->stacksize) { s->base = (int *) realloc(s->base, (s->stacksize + STACKINCREMENT) * sizeof(int)); if (!s->base) exit(0); s->top = s->base + s->stacksize; s->stacksize += STACKINCREMENT; } *(s->top++) = e; // 先赋值再加一 } // 出 int Pop(SqStack *s) { if (s->top == s->base) exit(0); // 空 return *(--s->top); // 先减一再取值 } // 十进转任意进 void conversion(int num, int base) { SqStack s; InitStack(&s); while (num) { Push(&s, num % base); // 余数入 num /= base; // 商作为下一次的被除数 } while (s.top != s.base) printf("%d", Pop(&s)); // 逆序输出 } int main() { int n, base; printf("请输入一个十进正整数:"); scanf("%d", &n); printf("请输入要转换成的进(2-16):"); scanf("%d", &base); if (base < 2 || base > 16) { printf("进数只能在2到16之间!\n"); return 0; } printf("%d转换成%d进是:", n, base); conversion(n, base); printf("\n"); return 0; } ``` 以上代码为 C 语言实现,可以将一个十进正整数转换为任意进(2-16)。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值