鱼C论坛

 找回密码
 立即注册
查看: 4374|回复: 12

[学习笔记] 数据结构:栈的应用-数制转换

[复制链接]
发表于 2021-10-13 20:05:03 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 划句顾 于 2021-10-13 20:05 编辑

作业题来着嘿嘿

代码如下(第一种方式)
/**
*author :LaoGu
*time   :2021/10/12
*purpose:栈的数制转换 --这个看起来比较复杂

**/
#include<iostream>

using namespace std;

一些定义:
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAXSIZE 100
/定义顺序栈
typedef struct{
   int *base;    //栈底指针
   int *top;     //栈顶指针
   int stacksize;  //栈可用的最大容量
}Sqstack;
//初始化函数
int Init(Sqstack &S){
  S.base = new int[MAXSIZE];
  if(!S.base) exit(OVERFLOW);
  S.top = S.base;
  S.stacksize = MAXSIZE;
  return OK;
}
//判断栈是否为空
bool stackEmpty(Sqstack &S){
        if (S.top==S.base)
                return true;
        else
                return false;
}
//入栈
int Push(Sqstack &S,int e){
        if(S.top-S.base==S.stacksize)  return ERROR;  //栈满
        *S.top++=e;
        return OK;
}
//出栈
int Pop(Sqstack &S,int &e){
  if(S.top==S.base) return ERROR;
  e=*--S.top;
  return OK;
}
//进制转换-十进制转换为八进制
void TenconversionEight(int N){
        Sqstack S;
        Init(S);
        int e;
        cout<<"由十进制转换八进制为:";
     while(N)
        {
                 Push(S,N%8);
                 N = N /8;
        }
         while(!stackEmpty(S))
         {
                 
                 Pop(S,e);
                 cout<<e;
         }
                 cout<<endl;
}
//进制转换-十进制转换为二进制
void TenconversionTwo(int N){
    Sqstack S;
        Init(S);
        int e;
        cout<<"由十进制转换二进制为:";
    while(N)
        {
                 Push(S,N%2);
                 N = N /2;
        }
         while(!stackEmpty(S))
         {
                 Pop(S,e);
                 cout<<e;
         }
          cout<<endl;
} 
//进制转换-十进制转换为十六进制
void TenconversionSixteen(int N){
        Sqstack S;
        Init(S);
        int e;
        cout<<"由十进制转换十六进制为:";
    while(N)
        {
                if(N%16<=9)
                 Push(S,N%16);
        else
        {        switch(N%16){
                  case 10:Push(S,'A');break;
                  case 11:Push(S,'B');break;
                  case 12:Push(S,'C');break;
                  case 13:Push(S,'D');break;
                  case 14:Push(S,'E');break;
                  case 15:Push(S,'F');break;
                }
        }
                 N = N /16;
        }
         while(!stackEmpty(S))
         {
                 Pop(S,e);
                 if(e>64&&e<71)  // ASCII表中A~F是65-70
                         printf("%c",e);
                 else
                   cout<<e;
         } 
                 cout<<endl;
}
//主函数
int main(){
        int N;
        cout<<"请输入数字:";
        cin>>N;
    TenconversionEight(N);  //转换为8进制
    TenconversionTwo(N);    //转换为2进制
        TenconversionSixteen(N); //转换为16进制
        return 0;
}

                               
登录/注册后可看大图




                               
登录/注册后可看大图

第二种方式:用一个函数来转换进制数

这个还是和前面的一样:
/**
*author :LaoGu
*time   :2021/10/12
*purpose:栈的数制转换 

**/
#include<iostream>

using namespace std;

#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAXSIZE 100

//定义顺序栈
typedef struct{
   int *base;    //栈底指针
   int *top;     //栈顶指针
   int stacksize;  //栈可用的最大容量
}Sqstack;

//初始化函数
int Init(Sqstack &S){
  S.base = new int[MAXSIZE];
  if(!S.base) exit(OVERFLOW);
  S.top = S.base;
  S.stacksize = MAXSIZE;
  return OK;
}

//判断栈是否为空
bool stackEmpty(Sqstack &S){
        if (S.top==S.base)
                return true;
        else
                return false;
}

//入栈
int Push(Sqstack &S,int e){
        if(S.top-S.base==S.stacksize)  return ERROR;  //栈满
        *S.top++=e;
        return OK;
}

//出栈
int Pop(Sqstack &S,int &e){
  if(S.top==S.base) return ERROR;
  e=*--S.top;
  return e;
}

不一样的是这个:将转换函数改成可以求二进制、八进制、十六进制了
游客,如果您要查看本帖隐藏内容请回复
//主函数
int main(){
        int a,b;
        while(1)
{
    cout<<"请输入需要进行数制转换的十进制数:";
        cin>>a;
        if(a<=0){
          cout<<"请重新输入十进制数!!!"<<endl;
          break;
        }
        cout<<"请输入需要转换的进制:";
        cin>>b;
        conversion(a,b);
        cout<<endl;
}
        return 0;
}


                               
登录/注册后可看大图

运行结果:

                               
登录/注册后可看大图



                               
登录/注册后可看大图

第三种方式:用头文件的方式来搞一搞:
游客,如果您要查看本帖隐藏内容请回复



                               
登录/注册后可看大图

我自己定义的头文件:
游客,如果您要查看本帖隐藏内容请回复


                               
登录/注册后可看大图



                               
登录/注册后可看大图

这个照片里面框起来的:在ASCII中A-F是65-70,所以是加55,而0-9是48-57,所以就这样搞

这次审核应该能过了吧QAQ

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-10-13 22:01:26 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-10-17 22:19:38 | 显示全部楼层
有话没话都回复一下,让我看看有没有人来看我的帖子
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-3 20:15:41 | 显示全部楼层
666
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-21 00:29:23 | 显示全部楼层
强强强!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-24 19:45:04 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-7-30 23:33:34 | 显示全部楼层
1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-18 01:31:43 | 显示全部楼层
太赞了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-14 22:12:32 | 显示全部楼层
有没有大神可以大概解释一下这个函数的基本结构啊啊啊啊啊啊啊啊啊啊啊啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-20 09:42:50 | 显示全部楼层
支持
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-3-28 16:59:41 | 显示全部楼层
谢谢分享!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-20 09:32:33 | 显示全部楼层
ganxie
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-5-6 19:13:08 | 显示全部楼层
感谢分享!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-23 17:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表