C_栈的应用----数制转换

来源:互联网 发布:js防水怎么样 编辑:程序博客网 时间:2024/06/14 04:52

编制一个满足下列要求的程序:

对于输入的任意一个非负十进制整数,打印输出与其等值的八进制数。由于上述计算过程是低位到高位顺序产生八进制数的各个数位,而打印输出,一般来说应从高位到低位进行,恰好和计算过程相反。


十进制的150转换为八进制

用150对8求余得到6压入栈中,此时栈中只有一个元素栈底6

用(150/8)=18对8求余得到2压入栈中,此时栈中有两个元素 6 2

用(18/8)=2对8求余得到2压入栈中,此时栈中有三个元素6 2 2

2/8=0此时退出元素入栈的操作


此时顺序出栈得到2 2 6

所以十进制150转化为八进制为226

函数操作实现如下:

void conversion(int num){//对于输入的任意一个非负十进制整数,打印输出与其等值的八位数ElemType e;SqStack S;InitStack(S);//构建一个空栈 while(num)//num为0退出进栈操作 {Push(S,num%8);//将对8求余得到的数压入栈中 num=num/8;}while(!StackEmpty(S))//当为空栈的时候退出出栈操作 {Pop(S,e);printf("%d",e);}printf("\n");}


嗯下面就是在VC中的测试:

#include<stdio.h>#include<stdlib.h>#include<string.h>#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0#define OVERFLOW -2#define STACK_INIT_SIZE  100//存储空间初始化分配量#define STACKINCREMENT 10//存储空间分配增量 typedef int ElemType;typedef int Status;typedef struct{ElemType*base;//栈底指针 ElemType*top;//栈顶指针 int stacksize;}SqStack;Status InitStack(SqStack &s){//构建一个空栈S。 s.base=(ElemType*)malloc(STACK_INIT_SIZE*(sizeof(ElemType)));if(!s.base){printf("建栈失败!\n");return ERROR; }else{s.top=s.base;//栈底和栈顶指针指向同一块内存 s.stacksize=STACK_INIT_SIZE;return OK; }}Status DestroyStack(SqStack &s){//销毁栈s,s不再存在。 s.top=s.base;free(s.base);s.base=NULL;//释放后一定要指向NULL,避免出现野指针 s.top=NULL;return OK;}Status ClearStack(SqStack &s){//将S清为空栈。 s.top=s.base;//栈顶和栈底指针指向同一块内存此时栈中就没有其它元素 s.stacksize=0;return OK;}Status StackEmpty(SqStack s){//若栈S为空栈,则返回TRUE,否则FALS。 if(s.top==s.base)return TRUE;elsereturn FALSE;}Status StackLength(SqStack s){//返回S的元素个数,即栈的长度.。 return s.top-s.base;}Status GetTop(SqStack s,ElemType &e){//用e返回S的栈顶元素 。 if(StackEmpty(s)){printf("这是一个空栈!");return ERROR;}else{s.top--;e=*s.top;return OK;}}Status Push(SqStack &s,ElemType e){//插入元素e为新的栈顶元素。if(StackLength(s)==STACK_INIT_SIZE){ElemType *temp=(ElemType*)realloc(s.base,(STACK_INIT_SIZE+STACKINCREMENT)*(sizeof(ElemType)));  if(!temp)return ERROR;s.base=temp;s.top=s.base+STACK_INIT_SIZE;s.stacksize=STACK_INIT_SIZE+STACKINCREMENT;*(s.top++)=e;return OK;}else{*s.top=e;s.top++;return OK; }}Status Pop(SqStack &s,ElemType &e){//删除S的栈顶元素,并用e返回其值if(StackEmpty(s)){printf("这是一个空栈\n");return ERROR; }else{e=*(--s.top);return OK;}}void PrintStack(SqStack s){//显示栈中的元素 if(StackEmpty(s)){printf("栈中没有数据元素!\n");}while(s.top!=s.base){printf("%d ",*(--s.top));}printf("\n");}void conversion(int num){//对于输入的任意一个非负十进制整数,打印输出与其等值的八位数ElemType e;SqStack S;InitStack(S);//构建一个空栈 while(num)//num为0退出进栈操作 {Push(S,num%8);//将对8求余得到的数压入栈中 num=num/8;}while(!StackEmpty(S))//当为空栈的时候退出出栈操作 {Pop(S,e);printf("%d",e);}printf("\n");}int main(){int num;printf("当输入小于等于0的数退出操作!\n");printf("转化前的十进制数:");while(scanf("%d",&num)&&num>0){printf("转化后的八进制数:");conversion(num);printf("转化前的十进制数:");}printf("成功退出操作!\n");return 0;}