版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
#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;
}