代码实现
(程序中已详细注释,这里不再重复说明,有疑惑可留意哦)
//导入头文件
#include<iostream>
#include<stdio.h>
#include<malloc.h>
using namespace std;//声明命名空间
//链栈
typedef struct stacknode{
int data;//数据域
struct stacknode *next;//指针域
}stacknode,*LinkStack;
//初始化栈,创建一个空栈
void initLinkStack(LinkStack &L){
L=NULL;//空链站
}
//判断栈是否为空
int emptyLinkStack(LinkStack L){
if(L==NULL){
return 0;
}else{
return 1;
}
}
//入栈
void pushLinkStack(LinkStack &L,int e){
LinkStack p;
p=(LinkStack)malloc(sizeof(stacknode));
p->data=e;
p->next=L;
L=p;
}
//出栈
void popLinkStack(LinkStack &L,int &e){
LinkStack p;
p=L;
e=L->data;//取出栈顶元素给e
L=L->next;
delete(p);
}
//十进制转2、8、16进制,采用除基倒取余法
void numberConversionL(int oNumber,int cvNumber){
LinkStack L; //创建栈
int x;
initLinkStack(L); //初始化栈
while(oNumber){
x=oNumber%cvNumber;
pushLinkStack(L,x);//余数入栈
oNumber=oNumber/cvNumber;
}
//余数出栈
while(emptyLinkStack(L)){
popLinkStack(L,x);
switch(x){
case 0: case 1: case 2: case 3:
case 4: case 5: case 6: case 7:
case 8: case 9:cout<<x; break;
case 10:cout<<"A"; break;
case 11:cout<<"B"; break;
case 12:cout<<"C"; break;
case 13:cout<<"D"; break;
case 14:cout<<"E"; break;
case 15:cout<<"F"; break;
}
}
}
//主函数
int main(){
int oNumber,cvNumber;
int oNumberL,cvNumberL;
int choose;
cout<<"请选择所需功能\n1.使用链栈转换\n2.退出程序";
cout<<endl; //换行
cin>>choose;
while(choose!=2){
switch(choose){
case 1:{
cout<<"请输入要转换的十进制数:"<<endl;
cin>>oNumberL;
cout<<"请输入要转换至的进制,仅限输入2、8以及16:"<<endl;
cin>>cvNumberL;
numberConversionL(oNumberL,cvNumberL);
break;
}
default:
cout<<"\n!!!您的选择不正确,请重新选择!!!\n";
}
cout<<endl; //换行
cout<<"请选择所需功能\n1.使用链栈转换\n2.退出程序";
cout<<endl; //换行
cin>>choose;
}
return 0;
}
运行结果
写在最后:
链栈、顺序栈实现进制转换原理相同,区别在于顺序栈、链栈的自身结构不同,如果想进一步了解顺序栈转换,请看文章: