#include<iostream>
#include<stdio.h>
#include<malloc.h>
using namespace std;
/* 将十进制数字N转换为D进制(D=2,8,16),其中16进制对应的符号是0~9,A~F。
要求:十进制数字和N进制的值从键盘输入获得;从屏幕显示进制转换后的数字。
*/
//1.链栈
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;
}
}
}
//2.顺序栈
typedef struct{
int *base; //栈底
int *top; //栈顶
int stacksize; //栈的容量
}SqStack;
//初始化栈,创建一个空栈
void initStack(SqStack &S){
int max=100;
S.base=(int *)malloc(max*sizeof(int));
S.top=S.base;
S.stacksize=max;
}
//判断栈是否为空
int emptyStack(SqStack S){
if(S.top!=S.base){
return 0;
}else{
return 1;
}
}
//入栈
void push(SqStack &S,int e){
if(S.top-S.base>=S.stacksize){
int remax=10;
S.base=(int *)realloc(S.base,(S.stacksize+remax)*sizeof(int)); //如果栈满了重新开辟空间
S.top=S.base+S.stacksize;
S.stacksize+=remax;
}
*(S.top)=e;
S.top++;
}
//出栈
void pop(SqStack &S,int &e){
if(emptyStack){
S.top--;
e=*(S.top);
}
}
//十进制转2、8、16进制,采用除基倒取余法
void numberConversion(int oNumber,int cvNumber){
SqStack S; //创建栈
int x;
initStack(S); //初始化栈
while(oNumber){
x=oNumber%cvNumber;
push(S,x);//余数入栈
oNumber=oNumber/cvNumber;
}
//余数出栈
while(S.top!=S.base){
pop(S,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;
}
}
}
//主函数
void main(){
int oNumber,cvNumber;
int oNumberL,cvNumberL;
int choose;
cout<<"请选择所需功能\n1.使用链栈转换\n2.使用顺序栈转换\n3.退出程序";
cout<<endl; //换行
cin>>choose;
while(choose!=3){
switch(choose){
case 1:{
cout<<"请输入要转换的十进制数:"<<endl;
cin>>oNumberL;
cout<<"请输入要转换至的进制,仅限输入2、8以及16:"<<endl;
cin>>cvNumberL;
numberConversionL(oNumberL,cvNumberL);
break;
}
case 2:{
cout<<"请输入要转换的十进制数:"<<endl;
cin>>oNumber;
cout<<"请输入要转换至的进制,仅限输入2、8以及16:"<<endl;
cin>>cvNumber;
numberConversion(oNumber,cvNumber);
break;
}
default:
cout<<"\n!!!您的选择不正确,请重新选择!!!\n";
}
cout<<endl; //换行
cout<<"请选择所需功能\n1.使用链栈转换\n2.使用顺序栈转换\n3.退出程序";
cout<<endl; //换行
cin>>choose;
}
}
- 1
- 2
前往页