问题 B: 十进制到二进制的转换

这个问题我们来用栈来实现

首先,我们先定义一个栈的结构体(栈的结构体与链表的结构体不可同,栈的结构体第二项是用int定义栈的顶端; 而链表的第二项,是用struct定义一个指针)

struct stack{int data[10005];int top;
};

接下来,我们来写一个创建栈的函数

void CreateStack(stack *st){st->top=-1;
}

注意,要将栈顶top定位-1,即栈的初始化

下面,我们来编写进栈的功能,用一个函数来实现

void push(int a,stack *st){st->top++;st->data[st->top]=a;
}

在push函数中,现将top+1,然后将top定位data数组的标号。这样我们就明白了为什么上个函数中要将栈的top定为-1,这样我们存入栈的第一个数就是data[0],第二个数就是data[1],与我们数组中的标号相一致,方便记忆:)

接下来,我们来编写出栈的功能。这样的功能我们用3个函数来实现,分别是  1.判断栈是否为空的函数    2.top-1的函数   3.取栈顶的函数

int isEmpty(stack *st){if(st->top==-1)return 1;return 0;
}void pop(stack *st){st->top--;
}int GetTop(stack *st){return st->data[st->top];
}

这时候我们就想问了,为什么进栈用一个函数就能实现,而出栈要用三个函数实现嘞?其实我们在int main()主函数之前做的函数声明,都是为主函数内的功能服务的,我们在主函数中的出栈代码是这样的

while(!isEmpty(&st)){printf("%d",GetTop(&st));pop(&st);}

我们可以看到while()的判断条件是 !isEmpty(&st),也就是说如果栈不为空,就执行下面的程序:printf("%d",GetTop(&st)),即打印栈顶函数,然后再pop(&st),即令top-1。我们知道栈的特点是什么呢?先进后出,后进先出。所以我们这段出栈代码的含义就是先输出栈顶的数,再令top-1,输出栈顶第二个函数......

最后,我们来编写主函数

int main(){int n;stack st;CreateStack(&st);scanf("%d",&n);while(n){push(n%2,&st);n=n/2;}while(!isEmpty(&st)){printf("%d",GetTop(&st));pop(&st);}return 0;
}

我们可以看到,这里进栈函数中的并不是单纯的push(n,&st)而是先用一个while循环,如果n>0,那么将n/2进栈,再将n变成n/2。那么,这种算法是什么意思嘞?我们知道,正常算十进制变二进制的时候,我们是这样算的

那么,这个算法也是同样的道理,先将数/2,记录下余数,进栈;再将数/2,记录......

其实这道题用栈写最关键的原因,就是我们想要输出的时候是从后往前出栈,也就是先进后出,后进先出。知道了这样的特点,我们就不难看出这种存储问题用队列或栈来写都可以。不过,最好、最简单的就是用栈了。

下面,为大家附上完整版的代码

#include<stdio.h>
#include<stdlib.h>
struct stack{int data[10005];int top;
};void CreateStack(stack *st){st->top=-1;
}void push(int a,stack *st){st->top++;st->data[st->top]=a;
}int isEmpty(stack *st){if(st->top==-1)return 1;return 0;
}void pop(stack *st){st->top--;
}int GetTop(stack *st){return st->data[st->top];
}int main(){int n;stack st;CreateStack(&st);scanf("%d",&n);while(n){push(n%2,&st);n=n/2;}while(!isEmpty(&st)){printf("%d",GetTop(&st));pop(&st);}return 0;
}

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/306716.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

javascript内存泄漏调试工具mac_node.js 内存泄漏的秘密

一直以来&#xff0c;跟踪 Node.js 的内存泄漏是一个反复出现的话题&#xff0c;人们始终希望对其复杂性和原因了解更多。并非所有的内存泄漏都显而易见。但是&#xff0c;一旦我们确定了其模式&#xff0c;就必须在内存使用率&#xff0c;内存中保存的对象和响应时间之间寻找关…

c++STL中的find()函数 有两种使用方法

cSTL中的find()函数 有两种使用方法 方法一&#xff1a; 开头引头文件&#xff1a;中的函数 其调用形式为 find&#xff08;start,end,value&#xff09; start搜寻的起点&#xff0c;end搜寻的终点&#xff0c;要寻找的value值; 如果没有找到&#xff0c;则返回end。函数的返…

关于C# Span的一些实践

Span这个东西出来很久了&#xff0c;居然因为5.0又火起来了。特别感谢RC兄弟提出这个话题。相关知识在大多数情况下&#xff0c;C#开发时&#xff0c;我们只使用托管内存。而实际上&#xff0c;C#为我们提供了三种类型的内存&#xff1a;堆栈内存 - 最快速的内存&#xff0c;能…

问题 C: 【例2-3】围圈报数

题目描述 有&#xff4e;(n<100)个人依次围成一圈&#xff0c;从第&#xff11;个人开始报数&#xff0c;数到第&#xff4d;个人出列&#xff0c;然后从出列的下一个人开始报数&#xff0c;数到第&#xff4d;个人又出列&#xff0c;…&#xff0c;如此反复到所有的人全部…

怎样用python批量处理文件夹_python批量处理文件或文件夹

本文实例为大家分享了python批量处理文件或文件夹的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下 # -*- coding: utf-8 -*- import os,shutil import sys import numpy as np ##########批量删除不同文件夹下的同名文件夹############# def arrange_file(dir_path0…

leetcode-349-两个数组的交集

给定两个数组&#xff0c;编写一个函数来计算它们的交集。 示例 1&#xff1a; 输入&#xff1a;nums1 [1,2,2,1], nums2 [2,2] 输出&#xff1a;[2] 示例 2&#xff1a; 输入&#xff1a;nums1 [4,9,5], nums2 [9,4,9,8,4] 输出&#xff1a;[9,4] 说明&#xff1a; 输…

Leansoft再发招贤令:面试官徐磊有话讲 | IDCF

&#xff08;图片来源于网络&#xff09;2020是Leansoft成立的第五年&#xff0c;凭借专业的服务及实施能力&#xff0c;逐渐成长为国内唯一的端到端专业DevOps实施服务公司。Leansoft是一家怎样的公司呢&#xff1f;准确地说&#xff0c;我们其实是国内唯一一家提供端到端的De…

问题 B: 数塔问题

题目描述 有如下所示的数塔&#xff0c;要求从顶层走到底层&#xff0c;若每一步只能走到相邻的结点&#xff0c;则经过的结点的数字之和最大是多少&#xff1f; 输入 第一行是一个整数N(1 < N < 20)&#xff0c;表示数塔的高度&#xff0c;接下来用N个数字表示数塔&a…

leetcode-345-翻转字符串中的元音字母

编写一个函数&#xff0c;以字符串作为输入&#xff0c;反转该字符串中的元音字母。 示例 1&#xff1a; 输入&#xff1a;“hello” 输出&#xff1a;“holle” 示例 2&#xff1a; 输入&#xff1a;“leetcode” 输出&#xff1a;“leotcede” 来源&#xff1a;力扣&…

e盾服务端源码_gRPC服务注册发现及负载均衡的实现方案与源码解析

今天聊一下gRPC的服务发现和负载均衡原理相关的话题&#xff0c;不同于Nginx、Lvs或者F5这些服务端的负载均衡策略&#xff0c;gRPC采用的是客户端实现的负载均衡。什么意思呢&#xff0c;对于使用服务端负载均衡的系统&#xff0c;客户端会首先访问负载均衡的域名/IP&#xff…

堆问题(最小堆变最大堆,堆删除,中序遍历)

2-6 设最小堆&#xff08;小根堆&#xff09;的层序遍历结果为 {8, 38, 25, 58, 52, 82, 70, 60}。用线性时间复杂度的算法将该堆调整为最大堆&#xff08;大根堆&#xff09;&#xff0c;然后连续执行两次删除最大元素操作&#xff08;DeleteMax&#xff09;。则该树的中序遍历…

推荐一款.NET Core开源爬虫神器:DotnetSpider

没有爬虫就没有互联网&#xff01;爬虫的意义在于采集大批量数据&#xff0c;然后基于此进行加工/分析&#xff0c;做更有意义的事情。谷歌&#xff0c;百度&#xff0c;今日头条&#xff0c;天眼查都离不开爬虫。去开源中国和Github查询C#的爬虫项目&#xff0c;仅有几个非常简…

Excel学习使用教程

1.Excel的保存与加密 加密&#xff1a; 我设置的密码&#xff1a;517485

python数据导入hive_Python操作HIve,将数据插入到Mysql

Python操作HIve&#xff0c;将数据插入到Mysql import sys from hive_service import ThriftHive from hive_service.ttypes import HiveServerException from thrift import Thrift from thrift.transport import TSocket from thrift.transport import TTransport from thrif…

问题 D: 二叉树求高度

题目描述 已知一棵二叉树用邻接表结构存储&#xff0c;求这棵树的高度。例&#xff1a;如图二叉树的数据文件的数据格式如下: 输入 第一行n为二叉树的结点个树&#xff0c;n≤100&#xff1b;以下第一列数据是各结点的值&#xff0c;第二列数据是左儿子结点编号&#xff0c;第…

.Net Core in Docker - 使用阿里云Codepipeline及阿里云容器镜像服务实现持续集成(CI)...

前面已经介绍过了 .Net Core In Docker 在容器内编译并发布的内容。但是每次通过 SSH 链接到服务器敲命令&#xff0c;运行脚本也是挺麻烦的一件事。程序员是最懒的&#xff0c;能让电脑解决的问题绝不手动解决&#xff0c;如果当我们push一次代码后自动build代码&#xff0c;自…

leetcode-445. 两数相加 II

给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。 你可以假设除了数字 0 之外&#xff0c;这两个数字都不会以零开头。 进阶&#xff1a; 如果输入链表不能修改该如何处理&#xff1f;换…

mysql 序列_MySql中序列的应用和总结

Mysql中的序列主要用于主键&#xff0c;主键是递增的字段&#xff0c;不可重复。Mysql与Oracle不同的是&#xff0c;它不支持原生态的sequence&#xff0c;需要用表和函数的组合来实现类似序列的功能。1.首先创建序列的主表/*2.其次创建如下三个函数&#xff0c;它们的功能分别…

汉诺塔问题详细解析zufeoj

汉诺塔&#xff08;Tower of Hanoi&#xff09;&#xff0c;又称河内塔&#xff0c;是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子&#xff0c;在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重…

靠刷算法题,真的可以刷进大厂吗?

我一直不知道我在大家心目中的定位是什么&#xff0c;但我内心其实是把自己定义为一个『工具人』的。可能是因为我自己本身就是程序员&#xff0c;所以更能理解程序员的不易吧。所以&#xff0c;我尽量不写水文&#xff0c;只分享干货。就是希望大家看了能够有所收获&#xff0…