为什么栈结构能实现进制转化(以二进制为例)

为什么栈结构能实现进制转化

代码实现

#include <stdio.h>//头文件,用于标准的输入和输出
#include <stdlib.h>//头文件,包含了一些常用的系统函数
#define STACK_INIT_SIZE 100 //宏定义
#define STACKINCREMENT 10  //宏定义


typedef int ElemType; //将 整型 int 关键字 重新命名为 Elemtype
typedef struct
{    ElemType *base;  //基指针 
    ElemType *top;  //栈顶指针 
    int stacksize; //当前空间 
 }SqStack;
 
 
 int InitStack(SqStack &s)  //栈的初始化 
 {
       //定义一个空栈
     //malloc 动态分配堆内存的语句
     s.base=(ElemType *)malloc(STACK_INIT_SIZE*sizeof(ElemType));
     if(!s.base) return 0;//当s.base!=0时返回0
     s.top=s.base;
     s.stacksize=STACK_INIT_SIZE;//令s.stacksize等于堆栈的初始化化长度
     return 1;
  }
  
  
int Push(SqStack &s,ElemType e) //栈的插入 
{
    if(s.top-s.base>=s.stacksize)//表示栈满,需要追加储存空间
    {
    //重新分配空间
    s.base=(ElemType *)realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(ElemType));
    if(!s.base) return 0;
    s.top=s.base+s.stacksize;
    s.stacksize+=STACKINCREMENT;
    }
    //将栈顶指向下一个空闲位置
    *s.top++=e;
    return 1;
}


int Pop(SqStack &s,ElemType &e) //栈的删除 
{
    if(s.top==s.base) return 0;//空栈返回0
    e=*--s.top;//删除
}


void tran_2(SqStack s,ElemType N) //2进制转换函数 
{  ElemType e;
   while(N)
   {
   //将2的余数入栈
       Push(s,N%2);
       N=N/2;
   }
   printf("转换为2进制数为:"); 
   while(s.base!=s.top)
   {
   //出栈
   //s是堆栈的地址
       Pop(s,e);
       printf("%d",e);
   }    
 }
void tran_8(SqStack s,ElemType N) //8进制转换函数 
{  ElemType e;
    //e相当于一个传入参数指针
   while(N)
   {
       Push(s,N%8);
       N=N/8;
   }
   printf("转换为8进制数为:"); 
   while(s.base!=s.top)
   {
       Pop(s,e);
       printf("%d",e);
   }    
 }
void tran_16(SqStack s,ElemType N) //16进制转换函数 
{  ElemType e;
   while(N)
   { if(N%16<10)
       Push(s,N%16);
       else
        { switch(N%16)
          { case 10:Push(s,65);break;
              case 11:Push(s,66);break;
              case 12:Push(s,67);break;
              case 13:Push(s,68);break;
              case 14:Push(s,69);break;
              case 15:Push(s,70);break;             
          }    
        }
       N=N/16;
   }
    printf("转换为16进制数为:"); 
   while(s.base!=s.top)
   {    if(*(s.top-1)>=0&&*(s.top-1)<10)
           {  Pop(s,e);
                 printf("%d",e);
           }
       else
       { Pop(s,e);
         printf("%c",e);
       }
   }    
 }
void menu() //打印菜单 
 { printf("----------------------------------2.转换为2进制-------------------------------------------"); 
   printf("\n---------------------------------8.转换为8进制----------------------------------");
   printf("\n------------------------------16.转换为16进制---------------------------------------\n");
 }
int main()
{  SqStack s;//s为参数,相当于声明一个栈名为s
   int choose; 
   ElemType N;
   InitStack(s); //栈的初始化 
   printf("输入十进制数:");
   scanf("%d",&N);
   printf("\n输入要转换的进制数:\n");
   menu();
   p:  //goto跳转语句,现在用的不多了
   scanf("%d",&choose);
   switch(choose)
   { case 2:tran_2(s,N);break; //当choose值为2时,进行转化为2的方法体重
        case 8:tran_8(s,N);break;
        case 16:tran_16(s,N);break;
        default :printf("没有此进制,请重新输入");goto p;
   }
    return 0;
}
最后修改:2022 年 10 月 10 日
如果觉得我的文章对你有用,请随意赞赏