作为栈的一个练习,使用栈来进行进制转换不得不说效率真的是非常低,超级低,最快的方法是直接用C语言的位运算
但是这里还是介绍一下操作思想
实际上进制转换这个东西本身不是很难,主要的工作部分都是在栈的建立和操作算法的编写上
至于什么是栈就不过多赘述了,这里主要是实现栈的三个主要功能,PUSH、POP和获取栈顶元素。
首先要为自己定义的栈开辟一块存储空间,常用情况是使用链表,但是这里我们使用的是一个完整的结构体来表示一个完整的栈
具体的声明方法如下:
struct numberStack{ DEFAULTYPE *bottom; DEFAULTYPE *top; DEFAULTYPE *dataSpace; int allLength; int nowLocation; }newStack;
没有采用链表式的栈主要还是我比较懒0.0
至于栈的PUSH和POP的操作都比较简单
void push(DEFAULTYPE waitInPush){ if(newStack.bottom == newStack.top){ initSpace(); } if(newStack.nowLocation == newStack.allLength-1){ reallocSpace(); } newStack.top++; (*newStack.top) = waitInPush; } void pop(){ if(newStack.bottom == newStack.top){ printf("Empty Stack Can Not POP\n"); return ; } (*newStack.top) = 0; newStack.top--; }
但是这里面有一个需要注意的东西,为了防止之后的操作给自己带来问题和麻烦,因此这里我还是建议栈底元素留空,这样可以防止以后while结束条件出问题,通常情况下while的条件为栈顶指针和栈底指针重合,如果在栈底存元素的话直接会造成栈底元素无法取出
至于进制转换的方法就是对2取余数然后除以2再保存到变量里,再重复操作
最后注意不要忘记初始化内存区域(init)
void initSpace(){ int *temp = (DEFAULTYPE *)calloc(INITLENGTH,sizeof(DEFAULTYPE)); newStack.allLength = INITLENGTH; newStack.top=newStack.bottom = temp; newStack.nowLocation = 0; }