数据结构--数制转换(栈的应用C++)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值