数据结构:利用栈实现数制转换

数制转换

从键盘输入一个十进制数n,并输入要转换的进制数m,利用栈将n转换成m进制,并输出转换后的结果。

首先设计一个含有多个菜单项的主菜单程序,然后再为这些菜单项配上相应的功能。

主菜单设计要求:

程序运行后,显示一个标题“进制转换”,标题下方给出4个菜单项的内容和输入提示:

  1. 输入一个十进制数n
  2. 输入进制转换m
  3. 进制转换
  4. 继续否?(y/n)

请选择1—4:

功能要求:

完成各菜单的要求,能用栈正确转换数制

栈是限定仅在表尾进行插入或删除操作的线性表,后进先出

特别注意:

进行进制转换时要考虑十六进制的特殊性,为完成十进制与十六进制间的转换利用if语句,对e的值进行判断:

当e大于10时,为保证十六进制正确转换:

当e的值等于11时,输出A;

当e的值等于12时,输出B;

当e的值等于13时,输出C;

当e的值等于14时,输出D;

当e的值等于15时,输出E;

流程图:


 

实验代码:

#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define OVERFLOW -2
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define STACK_INIT_SIZE 100                               //顺序栈存储空间的初始分配量
#define STACKINCREMENT 10
typedef int SElemType;
typedef int Status;


//顺序栈的存储结构
typedef struct{
	SElemType *base;                                      //栈底指针
	SElemType *top;                                       //栈顶指针
	int stacksize;                                        //栈可用的最大容量
}SqStack;


//顺序栈的初始化
Status InitStack(SqStack &S)                                           //构建一个空栈S
{
	S.base = (SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));    //为顺序栈动态分配一个容量为STACK_INIT_SIZE的数组空间 
	if(!S.base)
		exit (OVERFLOW);                                               //存储分配失败
	S.top = S.base;                                                    //top初始为base,空栈
	S.stacksize = STACK_INIT_SIZE;                                     //stacksize置为栈的最大容量STACK_INIT_SIZE
	return OK;
}


//顺序栈的入栈
Status Push(SqStack &S,SElemType e)
{                                             
	if(S.top - S.base == S.stacksize ){
		S.base=(SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));     //栈满,追加存储空间
	if(!S.base)
		return OVERFLOW;                                               //存储分配失败
	S.top=S.base +S.stacksize;
	S.stacksize+=STACKINCREMENT;
	}
	*S.top++ = e;                                                      //元素e压入栈顶,栈顶指针加一
	return OK;
}


//顺序栈的出栈
Status Pop(SqStack &S,SElemType &e)                            //         
{
	
	if(S.top==S.base)
		return ERROR;                                          //栈空,返回ERROR
	e = *--S.top;                                              //栈顶指针减一,将栈顶元素赋给e
	return e;
}


//主函数
int main()
{
	int choice;
	char c;
	int n,m;
	SElemType e;
	SqStack S;
	InitStack(S);
	printf("**********进制转换**********\n");
	printf("1.请输入一个十进制数n\n");
	printf("2.请输入转换的进制m\n");
	printf("3.进制转换\n");
	printf("4.继续或退出(y/n)\n");
	while(choice)                                          //保证操作的选择循环进行
	{
		printf("请选择操作1--4:\n");
		scanf("%d",&choice);
		if(choice >4 ||choice<=0)                          //如果输入的操作数不符合条件,则退出程序
		{
			printf("您输入的数据有误!\n");
			return 0;                                      //返回0,结束循环,退出程序
		}
		while(choice <= 4)                                 //进行操作1--4的选择
		{
			if(choice == 1)                               
			{
				printf("请输入一个十进制数:\n");
				scanf("%d",&n);
				break;
			}
			if(choice == 2)
			{
				printf("请输入转换的进制:\n");
				scanf("%d",&m);
				break;
			}
			if(choice == 3)
			{
				printf("进制转换:\n");
				while(n!=0)
				{
					Push(S,n%m);
					n=n/m;
				}
				while(S.top!=S.base)
				{
					e=Pop(S,e);
					if(e<10)
						printf("%d",e);
					else if(e>=10)
					{
						if(e==10)
							printf("A");
						if(e==12)
							printf("B");
						if(e==13)
							printf("C");
						if(e==14)
							printf("D");
						if(e==15)
							printf("E");
					}
				}
				printf("\n");
				break;
			}
			if(choice == 4)
			{
				printf("请输入y/n选择继续或退出\n");
				getchar();
				scanf("%c",&c);
				if(c=='y')
				{
					printf("请输入操作1--4继续运行程序:\n");
					scanf("%d",&choice);
				}
				if(c == 'n')
					return 0;                                     //返回0,结束循环,退出程序
			}
		}
	}
}

  • 22
    点赞
  • 214
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值