当前位置: 首页 > news >正文

Rust 数据结构与算法:4栈:用栈实现进制转换

2、进展转换

将十进制数转换为二进制表示形式的最简单方法是“除二法”,可用栈来跟踪二进制结果。

在这里插入图片描述

除二法

下面实现一个将十进制数转换为二进制或十六进制的算法,代码如下:

#[derive(Debug)]
struct Stack<T> {size: usize,  // 栈大小data: Vec<T>, // 栈数据
}impl<T> Stack<T> {// 初始化空栈fn new() -> Self {Self {size: 0,data: Vec::new(), // 以 Vec 为低层}}fn is_empty(&self) -> bool {0 == self.size}fn len(&self) -> usize {self.size}// 清空栈fn clear(&mut self) {self.size = 0;self.data.clear();}// 将数据保存在 Vec 的末尾fn push(&mut self, val: T) {self.data.push(val);self.size += 1;}// 将栈顶减 1 后,弹出数据fn pop(&mut self) -> Option<T> {if 0 == self.size {return None;};self.size -= 1;self.data.pop()}// 返回栈顶数据引用和可变引用fn peek(&self) -> Option<&T> {if 0 == self.size {return None;}self.data.get(self.size - 1)}fn peek_mut(&mut self) -> Option<&mut T> {if 0 == self.size {return None;}self.data.get_mut(self.size - 1)}// 以下是为栈实现的迭代功能// into_iter: 栈改变,成为迭代器// iter: 栈不变,得到不可变迭代器// iter_mut:栈不变,得到可变迭代器fn into_iter(self) -> IntoIter<T> {// into_iter()方法获取了一个迭代器,然后进行迭代IntoIter(self)}fn iter(&self) -> Iter<T> {let mut iterator = Iter { stack: Vec::new() };for item in self.data.iter() {iterator.stack.push(item);}iterator}fn iter_mut(&mut self) -> IterMut<T> {let mut iterator = IterMut { stack: Vec::new() };for item in self.data.iter_mut() {iterator.stack.push(item);}iterator}
}
// 实现三种迭代功能
struct IntoIter<T>(Stack<T>);
// Iterator 是 Rust 的迭代器 迭代器(iterator)负责遍历序列中的每一项和决定序列何时结束的逻辑。当使用迭代器时,我们无需重新实现这些逻辑。
impl<T: Clone> Iterator for IntoIter<T> {// into_iter()方法获取了一个迭代器,然后进行迭代。type Item = T;fn next(&mut self) -> Option<Self::Item> {// 迭代器之所以成为迭代器,是因为实现了Iterator trait。要实现该特征,最主要的就是实现其中的 next 方法,该方法控制如何从集合中取值,最终返回值的类型是关联类型 Item。if !self.0.is_empty() {self.0.size -= 1;self.0.data.pop()} else {None}}
}
// 'a 生命周期标识 用于帮助编译器检查引用的有效性,避免悬垂引用和使用已被释放的内存。
// 从所有权的角度来理解,就是它可以避免因为Copy或者clone的造成的不必要开销
struct Iter<'a, T: 'a> {stack: Vec<&'a T>, // 'a 被用在了传参类型 T 上
}
impl<'a, T> Iterator for Iter<'a, T> {type Item = &'a T; // 生命周期标识只作用于引用上,且放在&符号之后 如这里的 &'a Tfn next(&mut self) -> Option<Self::Item> {self.stack.pop()}
}struct IterMut<'a, T: 'a> {stack: Vec<&'a mut T>,
}
impl<'a, T> Iterator for IterMut<'a, T> {type Item = &'a mut T;fn next(&mut self) -> Option<Self::Item> {self.stack.pop()}
}
fn main() {let num1 = 10;let num2 = 43;let bin_str = base_converter(num1, 2);let hex_str = base_converter(num2, 16);println!("{num1}(十进制) = {bin_str}(二进制), {num2}(十进制) = {hex_str}(十六进制)");
}// 支持将 10进制数 转为 2 进制或 16 进制
fn base_converter(mut dec_num:u32,base:u32) -> String {// digits 对应各种余数的字符形式,尤其是 10-15let digits = ['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'];let mut rem_stack = Stack::new();// 余数入栈while dec_num > 0 {let rem = dec_num % base;rem_stack.push(rem);dec_num /= base;}// 余数出栈并取对应字符以拼接成字符串let mut base_str = "".to_string();while !rem_stack.is_empty() {let rem = rem_stack.pop().unwrap() as usize;base_str += &digits[rem].to_string();}base_str
}

运行结果:

在这里插入图片描述

相关文章:

  • 【C语言】linux内核tcp/ip协议代码
  • 【前端工程化面试题】如何优化提高 webpack 的构建速度
  • 【Web】从零开始的js逆向学习笔记(上)
  • C语言-----习题
  • Bee+SpringBoot稳定的Sharding、Mongodb ORM功能(同步 Maven)
  • django中配置使用websocket
  • 009集——磁盘详解——电脑数据如何存储在磁盘
  • 第8讲项目整合SpringSecurity
  • Qt:自定义信号,信号emit,传参问题,信号槽与moc
  • 蓝桥杯刷题--python-6
  • 【后端高频面试题--Nginx篇】
  • OpenCV-36 多边形逼近与凸包
  • 【C++】C++11上
  • OCP的operator——(4)用户任务:使用Operator创建etcd集群
  • ubuntu屏幕小的解决办法
  • 《剑指offer》分解让复杂问题更简单
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • 【译】理解JavaScript:new 关键字
  • 0x05 Python数据分析,Anaconda八斩刀
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • ECMAScript6(0):ES6简明参考手册
  • ES6之路之模块详解
  • Javascript设计模式学习之Observer(观察者)模式
  • JavaScript新鲜事·第5期
  • Lsb图片隐写
  • php中curl和soap方式请求服务超时问题
  • Python语法速览与机器学习开发环境搭建
  • Spring Boot MyBatis配置多种数据库
  • vue-loader 源码解析系列之 selector
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 初识 beanstalkd
  • 反思总结然后整装待发
  • 开发基于以太坊智能合约的DApp
  • 面试总结JavaScript篇
  • 爬虫模拟登陆 SegmentFault
  • 数据结构java版之冒泡排序及优化
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 学习Vue.js的五个小例子
  • 原生 js 实现移动端 Touch 滑动反弹
  • 正则与JS中的正则
  • 自动记录MySQL慢查询快照脚本
  • 最简单的无缝轮播
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • ​Python 3 新特性:类型注解
  • # Panda3d 碰撞检测系统介绍
  • (3)nginx 配置(nginx.conf)
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (JS基础)String 类型
  • (二)linux使用docker容器运行mysql
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • 、写入Shellcode到注册表上线
  • .naturalWidth 和naturalHeight属性,