采用顺序栈完成进制转换
(1)定义顺序栈的存储结构;
(2)实现顺序栈的初始化、判断是否为空、进栈、出栈等基本操作;
(3)调用顺序栈的基本操作实现进制转换。
代码:
#include <iostream>
#include<stdio.h>
#include<stdlib.h>
#include <malloc.h>
using namespace std;
typedef int SElemType;
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef struct {
SElemType *base;//在栈构造和销毁之前,base的值为NULL;
SElemType *top;//栈顶指正
int stacksize;//当前已经分配的存储空间
}SqStack;
int n, m;
int e;
SqStack S;
//调用基本操作实现进制转换
//栈的初始化 空栈
bool InitSack(SqStack &S) {
S.base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));
if (!S.base) return false;
S.top = S.base;
S.stacksize = STACK_INIT_SIZE;
return true;
}
//判断是否为空
bool StackEmpty(SqStack &S)
{
if (S.top == S.base) return false;
return true;
}
//进栈
bool Push(SqStack &S, int e)
{
if (S.top - S.base >= S.stacksize) {//栈满,追加空间
S.base = (SElemType *)realloc(S.base, (S.stacksize + STACKINCREMENT)*sizeof(SElemType));
if (!S.base) return false;
S.top = S.base + S.stacksize;
S.stacksize += STACKINCREMENT;
}
*S.top++ = e;
return true;
}
//出栈
void Pop(SqStack &S, int &e)
{//若栈不空。删除栈顶元素,用e返回值
e = *--S.top;
}
//进制转换
void conversion()
{
if (!InitSack(S))
{
printf("内存分配失败!\n");
return;
}
printf("%d用%d进制表示为:", n, m);
while (n) {
if (Push(S, n%m)) {
n = n / m;
}
else {
printf("内存分配失败!\n");
break;
}
}
while (StackEmpty(S)) {
Pop(S, e);
printf("%d", e);
}
printf("\n");
}
int main()
{
printf("请输入一个非负十进制数:");
scanf("%d", &n);
printf("请输入转换进制:");
scanf("%d", &m);
conversion();
system("pause");
return 0;
}