NOTICE: 本题代码是按照源码顺序贴上的,复制可直接运行
环境: Visual Stdio Code
题目:
对于输入的任意一个非负十进制整数,算出它的八进制。
说明:
严蔚敏版《数据结构》的第 48 页的算法有个问题:
出栈的时候必须有取地址符,不然会以一种类似于 copy 的形式出栈。
我稍微改了一下,毕竟书上写的是近似于伪码的算法(只是写个思路嘛,可以理解的)。
代码:
初始化:
#include<stdio.h>
#include<stdlib.h>
#define STACK_INIT_SIZE 10 // 初始分配量
#define STACKINCREMENT 1 // 分配增量
#define OK 1
#define ERROR 0
typedef int Status;
typedef int SElemType;
typedef struct
{
SElemType *base;
SElemType *top;
int stacksize;;
}SqStack;
Status InitStack(SqStack &S)
{ // 初始化
S.base = (SElemType *)malloc(STACK_INIT_SIZE *sizeof(SElemType));
if(!S.base) return ERROR;
S.top = S.base;
S.stacksize = STACK_INIT_SIZE;
return OK;
}//InitStack
销毁:
Status DestroyStack(SqStack &S)
{ // 销毁
if(S.base)
{
delete S.base;
S.stacksize = 0;
S.base = S.top = NULL;
}
return OK;
}//DestroyStack
入栈:
Status 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 = S.base + S.stacksize;
S.stacksize += STACKINCREMENT;
}
*S.top ++= e;
return OK;
}//Push
出栈:
Status Pop(SqStack &S, SElemType *e)
{ // 出栈
if(S.top == S.base) return ERROR;
*e = *--S.top;
return OK;
}//Pop
判断是否为空栈:
Status StackEmpty(SqStack &S)
{ // 判断是否为空
return S.top - S.base == 0;
}//StackEmpty
打印栈:
Status StackTraverse(SqStack &S)
{ // 打印栈
SElemType *p = (SElemType *)malloc(sizeof(SElemType));
p = S.top;
if(!p) return ERROR;
else
{
p--;
while(p >= S.base)
{
printf("%d\t", *p);
p--;
}
}
return OK;
}//StackTraverse
主函数:
int main()
{
SqStack S;
int N;
SElemType e;
if(InitStack(S)) printf("\n初始化栈成功!\n");
printf("\n请输入想要转换的非负十进制整数(以回车键结束):\n");
scanf("%d", &N);
getchar();
while(N)
{
Push(S, N %8);
N = N / 8;
}
printf("\n创建好的顺序栈为:\n");
StackTraverse(S);
printf("\n该数对应的八进制数为:\n");
while(!StackEmpty(S))
{
Pop(S, &e); // 出栈时要有取地址符,以确保地址的更新,防止 copy 的出现
printf("%d", e);
}
return OK;
}
结果示意图:
THE END!
更多推荐
任意十进制非负整数转化为八进制
发布评论