题目要求:
用栈制作进制转化器
实验代码:
#define OK 1
#define ERROR 0
#define STACK_INT_SIZE 20
#define STACKINCREMENT 10
typedef int SElemType;
#include <iostream>
#include <stdlib.h>
using namespace std;
typedef struct
{
SElemType* base;
SElemType* top;
int stacksize;
}SqStack;
//初始化栈
int InitStack(SqStack& S)
{
S.base = new SElemType[STACK_INT_SIZE];
if (!S.base) return ERROR;
S.top=S.base;
S.stacksize = STACK_INT_SIZE;
return OK;
}
//判断是否为空栈
int StackEmpty(SqStack& S)
{
if (S.base == S.top)
return OK;
return ERROR;
}
//新元素入栈
int 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 ERROR;
*(S.top++) = e;
S.stacksize += STACKINCREMENT;
return OK;
}
//栈顶元素出栈
int pop(SqStack& S, SElemType& e)
{
if (StackEmpty(S)) return ERROR;
e = *(--S.top);
return OK;
}
//进制转化操作(N:Number,B:Base)
void conversion(SqStack &S, int N, int B)
{
InitStack(S); //初始化一个栈
SElemType e;
char base[17] = "0123456789ABCDEF"; //定义一个字符数组,N相除B时余数全包含在内,使进制转化统一操作
cin >> N >> B;
while (N)
{
push(S, N % B); //余数入栈
N /= B; //得到下一轮循环时的值
}
while (!StackEmpty(S))
{
pop(S, e);
cout << base[e];
//ASCII码转换
//char c;
//if (e >= 10)
// c = 'A' + e - 10;
//else c = '0' + e;
//cout << c;
}
cout<< endl;
}
int DestoryStack(SqStack& S)
{
delete[]S.base;
S.base =S.top= NULL;
S.stacksize = 0;
return OK;
}
int main()
{
SqStack S;
int N=0, B=0;
//进制转化操作(N:Number,B:Base)
conversion(S, N, B);
DestoryStack(S);
return OK;
}