为什么栈结构能实现进制转化(以二进制为例)
代码实现
#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;
}
3 条评论
哈哈哈,写的太好了https://www.lawjida.com/
不错不错,我喜欢看 https://www.237fa.com/
秀