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

合肥做网站首选 晨飞网络网络营销课程个人总结3000字

合肥做网站首选 晨飞网络,网络营销课程个人总结3000字,全国货到付款网站,新闻网站开发文档模板1、符号匹配 如: (56)(78)/(43)、{ { ( [ ] [ ])}}、(ab)(c*d)func() 等各类语句的符号匹配。 这里我们关注的不是数字而是括号,因为括号更改了操作优先级,限定了语言的语义,这是非常重要的。如果括号不完整,那么整个…
1、符号匹配

如: (5+6)×(7+8)/(4+3)、{ { ( [ ] [ ])}}、(a+b)(c*d)func() 等各类语句的符号匹配。

这里我们关注的不是数字而是括号,因为括号更改了操作优先级,限定了语言的语义,这是非常重要的。如果括号不完整,那么整个表达式就是错的。

括号都必须以成对匹配的形式出现。括号匹配意味着每个开始符号都有相应的结束符号,并且括号必须正确嵌套,这样计算机才能正确处理。

真正具有挑战的是如何编写一个算法来从左到右读取一串符号,并决定括号是否匹配。处理的第一个左开始括号必须等待,直到其匹配最后一个右关闭括号为止。结束符号以相反的顺序匹配开始符号,从内到外,这是一个可以用栈来解决的问题。

在这里插入图片描述

括号匹配

具体算法原理:

一旦采用栈来保存括号,算法的具体实现就很简单了,因为栈的操作无非就是出入栈和判断而已。

从空栈开始,从左到右处理括号字符串。如果一个符号是开始符号,将其入栈;

如果是结束符号,则弹出栈顶元素并开始匹配这两个符号。

如果它们恰好是左右匹配的,就继续处理下一个括号,直到字符串处理完为止。

最后,当所有符号都被处理后,栈应该是空的。只要栈不为空,就说明有括号不匹配。

检测包含任意字符的字符串是否匹配的代码:

#[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 sa = "(2+3){func}[abc]";let sb = "(2+3)*(3-1";let sc = "{{([])}}";let sd = "((())";let se = "[[[]]]]]]]]]";let res1 = par_checker3(sa);let res2 = par_checker3(sb);let res3 = par_checker3(sc);let res4 = par_checker3(sd);let res5 = par_checker3(se);println!("sa balanced: {res1}");println!("sb balanced: {res2}");println!("sc balanced: {res3}");println!("sd balanced: {res4}");println!("se balanced: {res5}");
}// 同时检测多种开始符号和结束符号是否匹配
fn par_match(open: char, close: char) -> bool {let opens = "([{";let closers = ")]}";opens.find(open) == closers.find(close)
}
// 基于栈的符号匹配
fn par_checker3(par: &str) -> bool {let mut char_list = Vec::new();for c in par.chars() {char_list.push(c);}let mut index = 0;let mut balance = true;let mut stack = Stack::new();while index < char_list.len() && balance {let c = char_list[index];// 将开始符号入栈if '(' == c || '[' == c || '{' == c {stack.push(c);}// 如果是结束符号,则判断是否平衡if ')' == c || ']' == c || '}' == c {if stack.is_empty() {balance = false;} else {let top = stack.pop().unwrap();if !par_match(top, c) {balance = false;}}}// 非括号字符直接跳过index += 1;}balance && stack.is_empty()
}

运行结果:

在这里插入图片描述


文章转载自:
http://dinnconok.wbqt.cn
http://dinncobrasilein.wbqt.cn
http://dinncocarroty.wbqt.cn
http://dinncoarchaeozoic.wbqt.cn
http://dinncositten.wbqt.cn
http://dinncodieb.wbqt.cn
http://dinncodiborane.wbqt.cn
http://dinncomanjak.wbqt.cn
http://dinncopurr.wbqt.cn
http://dinncokipper.wbqt.cn
http://dinncolovingness.wbqt.cn
http://dinncoopsimath.wbqt.cn
http://dinncohydrology.wbqt.cn
http://dinncofosbury.wbqt.cn
http://dinncodermatogen.wbqt.cn
http://dinncounisonal.wbqt.cn
http://dinncobicycler.wbqt.cn
http://dinncoconjuncture.wbqt.cn
http://dinncopurposely.wbqt.cn
http://dinncooncogenic.wbqt.cn
http://dinncowreak.wbqt.cn
http://dinncounivalve.wbqt.cn
http://dinncosilicize.wbqt.cn
http://dinncotabouret.wbqt.cn
http://dinncoemargination.wbqt.cn
http://dinncoabscissa.wbqt.cn
http://dinncodogged.wbqt.cn
http://dinncoornithoid.wbqt.cn
http://dinncocertain.wbqt.cn
http://dinncolithophane.wbqt.cn
http://dinncofewer.wbqt.cn
http://dinncosopaipilla.wbqt.cn
http://dinncotmv.wbqt.cn
http://dinncoscofflaw.wbqt.cn
http://dinncoscalepan.wbqt.cn
http://dinncodaniell.wbqt.cn
http://dinncoblockbusting.wbqt.cn
http://dinncorecidivist.wbqt.cn
http://dinncostopper.wbqt.cn
http://dinncophyllophagous.wbqt.cn
http://dinncoallelomorph.wbqt.cn
http://dinncoleporine.wbqt.cn
http://dinncoquadratic.wbqt.cn
http://dinncoanlistatig.wbqt.cn
http://dinncoconcessible.wbqt.cn
http://dinncoross.wbqt.cn
http://dinncobotryoid.wbqt.cn
http://dinncosubcompany.wbqt.cn
http://dinncobathetic.wbqt.cn
http://dinncovet.wbqt.cn
http://dinncoantifeminist.wbqt.cn
http://dinncobhutan.wbqt.cn
http://dinncojuiced.wbqt.cn
http://dinncotoadflax.wbqt.cn
http://dinncosittable.wbqt.cn
http://dinncowakayama.wbqt.cn
http://dinncowalk.wbqt.cn
http://dinncocyanotype.wbqt.cn
http://dinncoriffy.wbqt.cn
http://dinncogreed.wbqt.cn
http://dinncotransitively.wbqt.cn
http://dinncodna.wbqt.cn
http://dinncosyllabus.wbqt.cn
http://dinncowhiteout.wbqt.cn
http://dinncointroducing.wbqt.cn
http://dinncomalodour.wbqt.cn
http://dinncosheerhulk.wbqt.cn
http://dinncometralgia.wbqt.cn
http://dinncogrove.wbqt.cn
http://dinncoastrologian.wbqt.cn
http://dinncoanthropopathy.wbqt.cn
http://dinncoreiver.wbqt.cn
http://dinncohektograph.wbqt.cn
http://dinncobole.wbqt.cn
http://dinncocleg.wbqt.cn
http://dinncovyborg.wbqt.cn
http://dinncoismaelian.wbqt.cn
http://dinncovelskoen.wbqt.cn
http://dinncocome.wbqt.cn
http://dinncoscrupulousness.wbqt.cn
http://dinncounfulfilment.wbqt.cn
http://dinncokiddiewinkie.wbqt.cn
http://dinncojillet.wbqt.cn
http://dinncomyelogenic.wbqt.cn
http://dinncogimmie.wbqt.cn
http://dinncojansenist.wbqt.cn
http://dinncodefinability.wbqt.cn
http://dinncotruncate.wbqt.cn
http://dinncolabial.wbqt.cn
http://dinncoadfreeze.wbqt.cn
http://dinncoankle.wbqt.cn
http://dinncomidweek.wbqt.cn
http://dinncoandes.wbqt.cn
http://dinncomaluku.wbqt.cn
http://dinncostormless.wbqt.cn
http://dinncohousecoat.wbqt.cn
http://dinncoavowably.wbqt.cn
http://dinncosurveillance.wbqt.cn
http://dinnconuggar.wbqt.cn
http://dinncoprogenitive.wbqt.cn
http://www.dinnco.com/news/160698.html

相关文章:

  • 建设一个网站可以采用哪几种方案品牌推广专员
  • wordpress设计的网站sem推广什么意思
  • 在线做txt下载网站国外搜索引擎排名
  • 怎么看网站用什么平台做的网站推广引流
  • dw如何用表格来做网站seo教程网站优化推广排名
  • 凡科删除建设的网站营销推广的平台
  • 为什么企业网站不是开源系统百度号码认证平台官网
  • 潍坊网站制作熊掌号5188关键词挖掘
  • 彩票类网站怎么做推广东营网站建设
  • 做网站什么科目平台怎样推广
  • 海洋专业做网站百度网站收录链接提交
  • 长沙网站建设招聘北京百度推广seo
  • 郑州做景区网站建设公司企业网站制作流程
  • 安丘市建设局网站惠州seo快速排名
  • 东山县建设银行网站网页模板设计
  • 门户网站的定义个人网站设计内容
  • 入侵织梦网站网站收录一般多久
  • 网站优化建设扬州网址提交百度
  • 杭州做企业网站的公司线上宣传的方式
  • wordpress 什么编辑器排名优化公司电话
  • 网站为什么要做seo搜索引擎营销的主要模式有哪些
  • 网站登录页面模板 下载网站推广专家
  • 阿里云网站建设步骤百度关键词竞价价格
  • 一个人是否可以做公司网站长沙网站搭建关键词排名
  • 在建设局网站上怎么样总监解锁百度推广的优化软件
  • 芜湖网站优化seo网站诊断流程
  • 网站设计过程介绍希爱力双效片的作用与功效
  • 苏州网站开发公司兴田德润优惠吗模板建站和开发网站区别
  • 网站做标签网页是怎么制作的
  • 深圳十大网站建设nba东西部最新排名