代码及问题描述
/*
*烟台大学计控学院
*作 者:张雯婧
*完成日期:2016年9月25日
*问题描述【项目 - 数制转换】 把十进制的整数转换为任一进制数输出。请利用栈设计算法,并实现程序。
提示:要转换为r进制,则原来的数逐次除以基数r(除完之后用商再除),直到商为0,得到的一系列余数的逆序就是转换结果。这里的“逆序”,意味着后产生的余数,会先输出,后进先出,栈的机会来了……
*/
1.sqstack.h的代码
#define MaxSize 100
typedef char ElemType;
typedef stryct
{
Elemtype data[MaxSize];
int top;//栈指针
}SqStack;
void InitStack(SqStack *&s);//初始化栈
void DestroyStack(SqStack *&s); //销毁栈
bool StackEmptySqStack *s); //栈是否为空
int StackLength(SqStack *s); //返回栈中元素个数——栈长度
void Push(SqStack *&s,ElemType e); //入栈
bool Pop(SqStack *&s,ElemType &e); //出栈
bool GetTop(SqStack *s,ElemType &e); //取栈顶数据元素
void DispStack(SqStack *s); //输出栈
void MultiBaseOutput (int number,int base);
2.sqstack.cpp的代码
void InitStack(SqStack *&s)//初始化栈
{
s=(SqStack *)malloc(sizeof (SqStack));
s->next=NULL;
}
void DestroyStack(SqStack *&s) //销毁栈
{
SqStack *p=s,*q=s->next;
if(q!=NULL)
{
free(p);
p=q;
q=p->next;
}
free(p);
}
bool StackEmpty(SqStack *s) //栈是否为空
{
return (s->next==NULL);
}
int StackLength(SqStack *s) //返回栈中元素个数——栈长度
{
SqStack *p=s->next;
int i;
if(p!=NULL)
{
i++;
p=p->next;
}
return(i);
}
void Push(SqStack *&s,ElemType e) //入栈
{
SqStack *p;
p=(SqStack *)malloc(sizeof (SqStack));
p->data=e;
p->next=s->next;
s->next=p;
}
bool Pop(SqStack *&s,ElemType &e) //出栈
{
SqStack *p;
if(s->next==NULL)
return false;
p=s->next;
s->next=p->next;
free(p);
return true;
}
bool GetTop(SqStack *s,ElemType &e) //取栈顶数据元素
{
if(s->next==NULL)
return false;
e=s->next->data;
return true;
}
void DispStack(SqStack *s) //输出栈
{
LiStack *p=s->next;
if(p!=NULL)
{
printf("%c ",p->data);
p=p->next;
}
printf("\n");
}
void MultiBaseOutput (int number,int base)
{
//假设number是非负的十进制整数,输出等值的base进制数
int i;
SqStack *S;
InitStack(S);
while(number)//从右向左产生base进制的各位数字,并将其进栈
{
Push(S,number%base);//将将余数进栈
number/=base;
}
while(!StackEmpty(S))//栈非空时退栈输出
{
Pop(S,i);
printf("%d",i);
}
}
3.main.cpp的代码
#include"sqstack.h"
#include<stdio.h>
int main()
{
MultiBaseOutput(10, 2);
return 0;
}
运行结果:
知识点总结
要转换为r进制,则原来的数逐次除以基数r(除完之后用商再除),直到商为0,得到的一系列余数的逆序就是转换结果。这里的“逆序”,意味着后产生的余数,会先输出,后进先出是栈的特点。
要转换为r进制,则原来的数逐次除以基数r(除完之后用商再除),直到商为0,得到的一系列余数的逆序就是转换结果。这里的“逆序”,意味着后产生的余数,会先输出,后进先出是栈的特点。
学习心得:
栈的应用,从算法分析问题,再考虑栈的特点性质。
栈的应用,从算法分析问题,再考虑栈的特点性质。