十六进制、十进制、八进制、二进制的转换(栈和队列实现、数据结构、C++)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_41359651/article/details/85094729
#include<iostream>
#include<math.h>
using namespace std;
#define MAXSIZE 100
typedef char SElemType;
typedef int Status;
//*******************************************************************栈的相关操作
typedef struct
{
	SElemType *base;
	SElemType *top;
	int stacksize;//栈的容量
	int number;//栈内元素个数
}Sqlist;//顺序栈
Status InitStack(Sqlist &S)//初始化顺序栈
{
	S.base = new SElemType[MAXSIZE];
	if (!S.base)return 0;//初始化失败
	S.top = S.base;
	S.stacksize = MAXSIZE;
	S.number = 0;
	return 1;
}
Status Push(Sqlist &S, SElemType e)//向栈顶插入元素 e
{
	if (S.top - S.base == S.stacksize)return 0;//栈满
	*S.top++ = e;
	S.number++;
	return 1;
}
Status Pop(Sqlist &S, SElemType &e)
{
	if (S.top == S.base)return 0;
	e = *--S.top;
	return 1;
}
Status CleanStack(Sqlist &S)//清空栈
{
	S.top = S.base;
	S.number = 0;
	return 1;
}
//*******************************************************************栈的相关操作
//*******************************************************************队列的相关操作
typedef struct
{
	SElemType *base;
	int front;
	int rear;
	int number;//队列内元素个数
}SqQueue;//循环队列
Status InitQueue(SqQueue &Q)//初始化循环队列
{
	Q.base = new SElemType[MAXSIZE];
	if (!Q.base)
	{
		cout << "ERROR"; return 0;
	}//初始化失败
	Q.front = Q.rear = 0;
	Q.number = 0;
	return 1;
}
Status EnQueue(SqQueue &Q, SElemType e)//循环队列的入队
{
	if ((Q.rear + 1) % MAXSIZE == Q.front)//队满
	{
		cout << "ERROR";
		return 0;
	}//system("pause");
	Q.base[Q.rear] = e;
	Q.rear = (Q.rear + 1) % MAXSIZE;
	Q.number++;
	return 1;
}
Status DeQueue(SqQueue &Q, SElemType &e)//循环队列的出队
{
	if (Q.rear == Q.front)return 0;//队空
	e = Q.base[Q.front];
	Q.front = (Q.front + 1) % MAXSIZE;
	Q.number--;
	return 1;
}
Status CleanQueue(SqQueue &Q)//清空循环队列
{
	Q.front = 0;
	Q.rear = 0;
	Q.number = 0;
	return 1;
}
//*******************************************************************队列的相关操作
Status ShiToER(Sqlist &S)//十进制转换为二进制函数
{
	int x;
	cout << "请输入一个十进制数:";
	cin >> x;
	int shang, yushu;
	shang = x;
	do 
	{
		yushu = shang % 2;
		shang = shang / 2;
		if(yushu==0)
			Push(S, '0');
		if (yushu == 1)
			Push(S, '1');
	} while (shang != 0);
	return 1;
}
Status ShiToBa(Sqlist &S)//十进制转换为八进制
{
	int x;
	cout << "请输入一个十进制数:";
	cin >> x;
	int shang, yushu;
	shang = x;
	do
	{
		yushu = shang % 8;
		shang = shang / 8;
		if (yushu == 0)Push(S, '0');
		else
			Push(S, '0' + yushu);
	} while (shang >= 8);
	Push(S, '0' + shang);
	return 1;
}
Status ShiToShiliu(Sqlist &S)//十进制转十六进制
{
	int x;
	cout << "请输入一个十进制数:";
	cin >> x;
	int shang, yushu;
	shang = x;
	while (shang)
	{
		yushu = shang % 16;
		shang = shang / 16;
		if (yushu < 10)
			Push(S, '0' + yushu);
		else
		{
			Push(S, 'A' + yushu - 10);
		}
	}
	return 0;
}
Status ShowStack(Sqlist &S)//输出栈内的元素
{
	char e;
	for (int i = 0; i < S.number; i++)
	{
		Pop(S, e);
		cout << e;
	}
	return 1;
}

Status ShowQueue(SqQueue &Q)//输出队列中的元素
{
	char e;
	for (int i = 0; i < Q.number; i++)
	{
		DeQueue(Q, e);
		cout << e;
	}
	return 1;
}
Status ErToShi(SqQueue &Q)//二进制转换为十进制
{
	char e[50], t;
	int x = 0;
	cout << "请输入二进制数:";
	cin >> e;
	for (int i = 0; i < strlen(e); i++)
	{
		if (e[i] == '0' || e[i] == '1')
			EnQueue(Q, e[i]);
		else
		{
			cout << "DATA ERROR";
			CleanQueue(Q);
			return 0;
		}
	}
	while (Q.rear != Q.front)
	{
		DeQueue(Q, t);
		if (t == '1')x = x + pow(2, Q.number);
		//cout << x << " " << Q.number << endl;
	}
	cout <<"十进制数为:"<< x;
	return 1;
}
Status BaToShi(SqQueue &Q)//八进制转换为十进制
{
	char e[50], t;
	int x = 0, T;
	cout << "请输入八进制数:";
	cin >> e;
	for (int i = 0; i < strlen(e); i++)
	{
		if (e[i]<'8')
			EnQueue(Q, e[i]);
		else
		{
			cout << "DATA ERROR";
			CleanQueue(Q);
			return 0;
		}
	}
	while (Q.rear != Q.front)
	{
		DeQueue(Q, t);
		T = t - '0';
		x = x + T * pow(8, Q.number);
	}
	cout << "十进制数为:" << x;
	return 1;
}
Status ShiliuToShi(SqQueue &Q)
{
	char e[50], t;
	int x = 0, T;
	cout << "请输入十六进制数:";
	cin >> e;
	for (int i = 0; i < strlen(e); i++)
	{
		if (e[i]<='9'&&e[i]>='0'|| e[i] <= 'F'&&e[i] >= 'A')
			EnQueue(Q, e[i]);
		else
		{
			cout << "DATA ERROR";
			CleanQueue(Q);
			return 0;
		}
	}
	while (Q.rear != Q.front)
	{
		DeQueue(Q, t);
		if (t >= '0'&&t <= '9')
			x = x + (t - '0')*pow(16, Q.number);
		else
			x = x + (t - 'A' + 10)*pow(16, Q.number);
	}
	cout << "十进制数为:" << x;
	return 1;
}
void Menu1(Sqlist &S)//菜单函数   十进制转n进制
{
	system("cls");
	cout << "1.十进制转二进制" << endl;
	cout << "2.十进制转八进制" << endl;
	cout << "3.十进制转十六进制" << endl;
	cout << "0.返回上一层" << endl;
	int choice;
	cout << "请输入您的选择:";
	cin >> choice;
	switch (choice)
	{
	case 1:ShiToER(S); ShowStack(S); CleanStack(S); system("pause"); Menu1(S); break;
	case 2:ShiToBa(S); ShowStack(S); CleanStack(S); system("pause"); Menu1(S); break;
	case 3:ShiToShiliu(S); ShowStack(S); CleanStack(S); system("pause"); Menu1(S); break;
	case 0:break;
	default:cout << "输入错误!"; system("pause"); Menu1(S); break;
	}
}
void Menu2(SqQueue &Q)//菜单函数   m进制转十进制
{
	system("cls");
	cout << "1.二进制转十进制" << endl;
	cout << "2.八进制转十进制" << endl;
	cout << "3.十六进制转十进制" << endl;
	cout << "0.返回上一层" << endl;
	int choice;
	cout << "请输入你的选择:";
	cin >> choice;
	switch (choice)
	{
	case 1:ErToShi(Q); CleanQueue(Q); system("pause"); Menu2(Q); break;
	case 2:BaToShi(Q); CleanQueue(Q); system("pause"); Menu2(Q); break;
	case 3:ShiliuToShi(Q); CleanQueue(Q); system("pause"); Menu2(Q); break;
	case 0:break;
	}
}
void Menu(Sqlist &S, SqQueue &Q)
{
	system("cls");
	int choice;
	cout << "1.m进制转十进制" << endl;
	cout << "2.十进制转换为n进制" << endl;
	cout << "0.退出" << endl;
	cout << "请输入你的选择:";
	cin >> choice;
	switch (choice)
	{
	case 1:Menu2(Q); Menu(S, Q); break;
	case 2:Menu1(S); Menu(S, Q); break;
	case 0:break;
	default:cout << "输入错误!"; system("pause"); Menu(S, Q); break;
	}
}
int main()
{
	char e;
	Sqlist S;
	SqQueue Q;
	InitStack(S);
	InitQueue(Q);
	Menu(S, Q);
	//Menu1(S);
	//Menu2(Q);
	//cout << "\n" << S.number;
	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41359651/article/details/85094729