/*
数制转换
(1348)10 = (2504)8
转换算法:
N N/8 N mod 8(求余)
1348 168 4
168 21 0
21 2 5
2 0 2
对于输入的任意一个非负十进制整数 打印输出与其等值的八进制数
而算法的过程是由低位到高位顺序产生八进制的各个数位,而打印输出
恰好和计算过程相反 因此若将计算过程得到的八进制数的各位顺序进栈
则按出栈序列打印输出的即为与输入对应的八进制数
*/
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define STACK_INIT_SIZE 10 //存储空间初始分配量
#define STACKINCREMENT 2 // 存储空间分配增量
typedef struct Node
{
int *top; //指向栈顶
int *base;//指向栈底
int stacksize;//当前已经分配的储存空间
}SqStack;
bool InitStack(SqStack *s);
bool Push(SqStack *s, int e); //压栈
bool StackEmpty(SqStack s);//判断栈是否为空
bool Pop(SqStack *s,int *e);//删除栈顶元素并把栈顶元素赋给e
int main()
{
struct Node s;
unsigned n; //定义非负整数
int e;
InitStack(&s); //栈的初始化
printf("n(>=0)= ");
scanf("%d",&n);
while(n)
{
Push(&s,n%8);
n = n/8;
}
while( !StackEmpty(s) ) //当栈不为空时
{
Pop(&s,&e); //弹出栈顶元素且赋值给e
printf("%d",e);
}
printf("\n");
return 0;
}
bool InitStack(SqStack *s)
{
s->base = (int *)malloc(STACK_INIT_SIZE*sizeof(int));
if(s->base == NULL)
{
printf("内存分配失败,程序终止!");
exit(-1);
}
s->top = s->base;
s->stacksize = STACK_INIT_SIZE;
return true;
}
bool Push(SqStack *s,int e)
{
if( s->top - s->base >= s->stacksize) //栈满 追加存储空间
{
s->base = (int *)realloc(s->base,
(s->stacksize + STACKINCREMENT)*sizeof(int));
if(s->base == NULL)
exit(-1);
s->top = s->base + s->stacksize;
s->stacksize += STACKINCREMENT;
}
*(s->top)++ = e;
return true;
}
bool StackEmpty(SqStack s)
{
if(s.base == s.top)
return false;
else
return true;
}
bool Pop(SqStack *s,int *e)
{
if(s->top == s->base)
return false;
*e = *(--s->top);
return true;
}
进制转换 十进制转化为八进制 通过栈实现
最新推荐文章于 2020-06-27 18:55:01 发布