栈的应用1:进制转换
1.进制转化简图

也就是每次进制数取余,最后一次将余数全部返回输出,我们不禁想到栈的特点,后进先出,满足这种特点,同样的我们也可以利用递归的方法,最后全部输入。
2.进制转化
说明:本代码仅支持十进制相互转化
函数列表:
#pragma once
#include <iostream>
#include <stdlib.h>
#define INIT_STACK_SIZE 50 //初始栈空间
#define STACKINCREMENT 10 //增加步长
typedef struct
{
int *base; //栈底指针
int *top; //栈顶指针
int stackSize; //栈长
}sqStack;
//初始化栈
void InitStack(sqStack *s);
//压栈
void Push(sqStack *s,int e);
//出栈
void Pop(sqStack *s,int &e);
//销毁栈
void DestoryStack(sqStack *s);
//打印
void print(sqStack s);
//获取栈长
int StackLen(sqStack s);
//进制转化
void decoct(sqStack *s,int ph1,int ph2);
函数实现
#include "SqStack.h"
void InitStack(sqStack *s)
{
s->base = (int *)malloc( INIT_STACK_SIZE * sizeof(int));
if ( !s->base )
{
exit(0);
}
s -> top = s -> base;
s->stackSize = INIT_STACK_SIZE;
}
void 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)
{
exit(0);
}
s->top = s->base + s->stackSize;
s->stackSize += STACKINCREMENT;
}
*s -> top = e;
s -> top++;
}
void Pop(sqStack *s,int &e)
{
if (s -> base == s->top)
std::cout <<"栈满了"<<std::endl;
else
{
e = *--(s->top);
}
}
void DestoryStack(sqStack *s)
{
s ->base = s->top = NULL;
s -> stackSize = 0;
}
int StackLen(sqStack s)
{
return(s.top - s.base);
}
void print(sqStack s) //逆向打印
{
int num=0 ;
int len = StackLen(s);
for (int i = 0 ; i < len;i++)
{
Pop(&s,num);
std::cout << num;
}
}
void decoct(sqStack *s,int ph1,int ph2)
//对栈进行操作,必须以指针的方式,这里循环取余,并且压入栈中
{
int yu = 0;
while ( ph1 )
{
yu = ph1%ph2;
Push(s,yu);
ph1 /= ph2;
}
}
主函数
#include "SqStack.h"
int main()
{
sqStack s;
InitStack(&s);
std::cout <<"输入要转换的数(10进制)和进制(10进制):"<<std::endl;
int a,b;
std::cin >> a >> b;
decoct(&s,a,b);
int len =StackLen(s);
std::cout <<"栈的当前容量是:"<< len <<std::endl;
print(s);
DestoryStack(&s);
}
3.使用递归方法
递归简化代码,像本人这种初学者来说还是花了一会来理解,但是只要掌握了递归的思想,结合本题中打印是从后向前,就容易理解一点。
#include <iostream>
int gn(int x,int y)
{
if (x==0)
return 0;
else
{
gn(x/y,y);
std::cout << x%y<<std::endl;
}
}
int main()
{
int x,y;
std::cout <<"输入操作数和进制"<<endl;
std::cin>>x>>y;
gn(x,y);
}
博客主要介绍栈在进制转换中的应用。利用栈后进先出的特点,可实现进制数取余后的结果输出。同时也提到了使用递归方法进行进制转换,递归虽简化代码,但对于初学者理解有一定难度,结合打印顺序较易理解。代码仅支持十进制相互转化。
2418

被折叠的 条评论
为什么被折叠?



