/*
栈的基本应用:进制转换
*/
#include<iostream>
#include<malloc.h>
#include<stdio.h>
#define STACK_INIT_SIZE 100 //存储空间初始分配量
#define STACK_INCRESEMENT 10
using namespace std;
typedef struct {
int* base;
int* top;
int stacksize;//当前已经分配的存储空间
}SqStack;
//构造一个空栈
void InitStack(SqStack& S) {
S.base = (int*)malloc(STACK_INIT_SIZE * sizeof(int));
S.top = S.base;
S.stacksize = STACK_INIT_SIZE;
}
//插入元素作为新的栈顶元素
void Push(SqStack& S, int a) {
//栈满,追加存储空间
if (S.top - S.base > S.stacksize) {
S.base = (int*)realloc(S.base, (S.stacksize + STACK_INCRESEMENT) * sizeof(int));//追加存储空间
if (!S.base) exit(0);
S.top = S.base + S.stacksize;
S.stacksize += STACK_INCRESEMENT;
}
*S.top++ = a;
}
//若栈不为空,则删除栈顶元素,用b取出
void Pop(SqStack& S, int& b) {
if (S.base == S.top)
exit(0);
b = *(--S.top);
}
// 判断栈是否为空
bool StackEmpty(SqStack& S) {
if (S.top == S.base)
return true;
else
return false;
}
int main()
{
int number;
SqStack mystack;
InitStack(mystack);
cout << "请输入十进制数:" << endl;
cin >> number;
int temp1, temp2, temp3;
temp1 = temp2 = temp3 = number;
// 二进制
while (temp1) {
// 余数逐个进栈
Push(mystack, temp1 % 2);
temp1 = temp1 / 2;
}
// 出栈
cout << "十进制转化为二进制为:";
while (!StackEmpty(mystack)) {
int result;
Pop(mystack, result);
cout << result;
}
cout << endl;
// 八进制
while (temp2) {
// 余数逐个进栈
Push(mystack, temp2 % 8);
temp2 = temp2 / 8;
}
// 出栈
cout << "十进制转化为八进制为:";
while (!StackEmpty(mystack)) {
int result;
Pop(mystack, result);
cout << result;
}
cout << endl;
// 十六进制
while (temp3) {
// 余数逐个进栈
Push(mystack, temp3 % 16);
temp3 = temp3 / 16;
}
// 出栈
cout << "十进制转化为十六进制为:";
while (!StackEmpty(mystack)) {
int result;
Pop(mystack, result);
if (result > 9) {
switch (result - 9) {
case 1:cout << "A"; break;
case 2:cout << "B"; break;
case 3:cout << "C"; break;
case 4:cout << "D"; break;
case 5:cout << "E"; break;
case 6:cout << "F"; break;
}
}
else
cout << result;
}
return 0;
}
运行结果