C语言实现任意栈之间的进制转换

题目:

        利用栈,将十进制数字N转换为D进制(D=2,8,16),其中16进制对应的符号是0~9,A~F。

        要求:十进制数字和N进制从键盘输入获得,从屏幕显示进制转换后的数字。

代码:

#include <stdio.h>
#define StackSize 100
#define true 1
#define false 0
typedef int DataType;

typedef struct{
	DataType data[StackSize];
	int top;
}SeqStack; 

typedef struct Node{
	DataType data;
	struct Node *next;
}*LinkStack;

//顺序栈初始化 
void InitStack(SeqStack &S){
	S.top=-1;
} 

//判断顺序栈是否满
int StackEmpty(SeqStack &S){
	if(S.top==-1){
		return true;
	}else{
		return false;
	}
} 

//顺序栈进栈
int Push(SeqStack &S,DataType x){
	if(S.top==StackSize-1){
		return false;
	}else{
		S.top++;
		S.data[S.top]=x;
		return true; 
	}
} 

//顺序栈出栈
int Pop(SeqStack &S,DataType &x){
	if(S.top==-1){
		return false;
	}else{
		x=S.data[S.top];
		S.top--;
		return true;
	}
} 

//顺序栈进制转换
void Conversion(){
	int N,D,e;
	SeqStack S;
	InitStack(S);
	printf("请输入要转换的十进制数字是:");
	scanf("%d",&N);
	printf("请输入要转换的进制是(2-9及16):");
	scanf("%d",&D); 
	int num=N;
	while(N){
		Push(S,N%D);
		N=N/D;	
	}
	while(!StackEmpty(S)){
		Pop(S,e);
		if(e>9){
			//十六进制 
			printf("%c",e+55);
		}else{
			printf("%d",e);
		}		
	}
	printf("\n"); 
} 

//链式栈是否为空栈 
int Empty2(LinkStack top){
	if(top==NULL){
		return true;
	}
	return false;
} 

//链式栈进栈
int Push2(LinkStack *top,DataType x){
	LinkStack s;
	s=new Node;
	if(s==NULL){
		return false;
	}else{
		s->data=x;
		s->next=(*top);
		(*top)=s;
		return true;
	}
} 

//链式栈出栈 
int Pop2(LinkStack *top,DataType *x){
	if(top!=NULL){
		LinkStack p=(*top);
		(*x)=(*top)->data;
		(*top)=(*top)->next;
		delete(p);
	}
	return false;
} 
 
int main(){
	
	while(1){
		printf("请选择所需功能:\n");
		printf("1、使用链栈转换\n");
		printf("2、使用顺序栈转换\n");
		printf("3、退出程序\n\n");
		int number;
		scanf("%d",&number); 
		if(number==1){
			Conversion2();
		}else if(number==2){
			Conversion();
		}else if(number==3){
			break;
		}else{
			printf("输入有误!\n");
		}
	}
	return 0;
} 

效果图:

猜你喜欢

转载自blog.csdn.net/qq_42680327/article/details/129717953