7、数据结构笔记之七栈的应用之数制转换
来源:互联网 发布:surface软件推荐 编辑:程序博客网 时间:2024/06/05 01:11
7、数据结构笔记之七栈的应用之数制转换
“人生意义的大小,不在乎外界的变迁,而在乎内心的经验。”
来看下栈在数制转换的作用。
1. 原理介绍
十进制N和其他进制数的转换时计算机实现计算的基本问题。简单算法如下:
N=(N div d )x d + N modd
2. 实现
2.1 定义结构体
定义堆栈的结构体
typedefstruct
{
int*base;
intstacksize;
int*top;
}sqstack;
2.2 初始化堆栈
传入的参数是堆栈结构体的指针。分配10个整型的节点。
void initstack(sqstack *S)
{
//创建一个空栈
(*S).base=(int*)malloc(sizeof(int)*10);
if(!(*S).base)exit(0);
(*S).stacksize=10;
(*S).top=(*S).base;
}
2.3 Pop函数
Pop是从堆中弹出一个元素
int pop(sqstack *S)
{
//输出堆栈的元素
inte;
if((*S).base==(*S).top)exit(0);
e=*(--(*S).top);
returne;
}
2.4 Push函数
Push 函数想堆中压入一个元素。当超过堆本身拥有的最大上限时候,需要重新分配堆,每次扩大4个int字节。
void push(sqstack *S,inte)
{
if((*S).top-(*S).base>=(*S).stacksize) //当初始化的空间被用完了之后,重新分配新的内存给堆栈
{
S->base=(int*)realloc((*S).base,sizeof(int)*(S->stacksize+4));
if(!(*S).base)exit(0);
(*S).top=(*S).base+(*S).stacksize;
S->stacksize=S->stacksize+4;
printf("afterrealloc %d\n",(*S).stacksize);
}
*(*S).top++=e;
}
3. Main
最后注意释放malloc得到的内存空间,最后得到如下图1:
void main()
{
intn,m;
chare;
sqstackS;
initstack(&S);
printf("输入要转换的十进制数和要转换成什么进制:");
scanf("%d%d",&n,&m);
while(n)
{
push(&S,n%m);//调用入栈函数,具体的函数自己写
n=n/m;
}
while(StackEmpty(&S))//判断堆栈是否为空
{
e=pop(&S);//出栈
printf("%d",e);
}
free(S.base);
}
4. 源码
#include<stdio.h>
#include<stdlib.h>
typedefstruct
{
int*base;
intstacksize;
int*top;
}sqstack;
void initstack(sqstack *S)
{
//创建一个空栈
(*S).base=(int*)malloc(sizeof(int)*4);
if(!(*S).base)exit(0);
(*S).stacksize=4;
(*S).top=(*S).base;
}
int pop(sqstack *S)
{
//输出堆栈的元素
inte;
if((*S).base==(*S).top)exit(0);
e=*(--(*S).top);
returne;
}
void push(sqstack *S,inte)
{
if((*S).top-(*S).base>=(*S).stacksize) //当初始化的空间被用完了之后,重新分配新的内存给堆栈
{
S->base=(int*)realloc((*S).base,sizeof(int)*(S->stacksize+4));
if(!(*S).base)exit(0);
(*S).top=(*S).base+(*S).stacksize;
S->stacksize=S->stacksize+4;
printf("afterrealloc %d\n",(*S).stacksize);
}
*(*S).top++=e;
}
int StackEmpty(sqstack *S)
{
if((*S).top==(*S).base)
return0;
else
return1;
}
void main()
{
intn,m;
chare;
sqstackS;
initstack(&S);
printf("输入要转换的十进制数和要转换成什么进制:");
scanf("%d%d",&n,&m);
while(n)
{
push(&S,n%m);//调用入栈函数,具体的函数自己写
n=n/m;
}
while(StackEmpty(&S))//判断堆栈是否为空
{
e=pop(&S);//出栈
printf("%d",e);
}
free(S.base);
}
- 7、数据结构笔记之七栈的应用之数制转换
- 第六周--数据结构--队列的应用之数制转换(栈)
- 栈的应用之数制转换
- 栈的应用之数制转换
- 栈的应用之数制转换
- 栈的应用之数制转换
- PHP数据结构之六 PHP栈的应用举例【数制转换和括号匹配算法】
- 栈的基本应用-数制转换-数据结构
- 数据结构实验之栈一:数制转换
- 数据结构(C语言)读书笔记5:栈的应用之数制转换及C语言代码实现
- 数据结构(8)--栈的应用之行编辑程序、括号匹配检验、数制转换、hanio塔问题
- 栈的运用之数制转换
- 【数据结构】栈的应用--数制转换(c++)
- 算法:数制转换(栈的应用)-数据结构(6)
- 数据结构 P48 算法实现 栈的应用举例-数制转换
- 栈的应用:数制转换
- 栈的应用----数制转换
- 栈的应用数制转换
- Linux 下安装 Tomcat
- 1051. Biker's Trip Odomete
- react 环境快速搭建
- Turtlebot3入门手册之七:SLAM和导航
- Python入门学习之汉诺塔的移动问题
- 7、数据结构笔记之七栈的应用之数制转换
- 2017 ACM-ICPC 亚洲区(沈阳区)网络赛
- D3系列第四弹——绘制气泡图
- PH代码审计常用工具
- VC中的双缓冲绘图技术
- C++虚函数理解(一)
- [ICLR2016]All You Need is a Good Init
- 8、数据结构笔记之八栈的应用之括号匹配检验实现
- C++/C++11中std::numeric_limits的使用