符号匹配

news/2025/2/28 21:14:35/文章来源:https://www.cnblogs.com/YP-L/p/18744110

符号匹配是一种常见的算法问题,主要用于检查给定的字符串中
各种符号(如括号()、方括号[]、花括号{}等)是否正确配对和嵌套。
在一个合法的符号序列中,每个左符号(如(、[、{)都必须有一个对应
的右符号(如)、]、}),并且符号的嵌套顺序必须正确。
例如,{[()]} 是一个合法的符号序列,而 {[(])} 则不是,
因为 [ 和 ] 的嵌套顺序被打乱了。

实现思路
通常使用栈(Stack)这种数据结构来解决符号匹配问题。具体步骤如下:

遍历输入的字符串。
当遇到左符号时,将其压入栈中。
当遇到右符号时,检查栈顶元素是否为对应的左符号。如果是,则将栈顶元素弹出;如果不是或者栈为空,则说明符号不匹配。
遍历结束后,如果栈为空,则说明所有符号都匹配;否则,说明有左符号没有对应的右符号。

 1 #include <iostream>
 2 #include <stack>
 3 #include <string>
 4 using namespace std;
 5 
 6 // 函数用于检查符号是否匹配
 7 bool isMatchingPair(char opening, char closing) {
 8     if (opening == '(' && closing == ')') return true;
 9     if (opening == '[' && closing == ']') return true;
10     if (opening == '{' && closing == '}') return true;
11     return false;
12 }
13 
14 // 函数用于检查字符串中的符号是否匹配
15 bool isBalanced(const string& expression) {
16     stack<char> s;
17     for (char ch : expression) {
18         if (ch == '(' || ch == '[' || ch == '{') {
19             // 如果是左符号,将其压入栈中
20             s.push(ch);
21         } else if (ch == ')' || ch == ']' || ch == '}') {
22             if (s.empty()) {
23                 // 如果栈为空,说明没有对应的左符号
24                 return false;
25             } else {
26                 char top = s.top();
27                 s.pop();
28                 if (!isMatchingPair(top, ch)) {
29                     // 如果栈顶元素与当前右符号不匹配
30                     return false;
31                 }
32             }
33         }
34     }
35     // 遍历结束后,如果栈为空,则说明所有符号都匹配
36     return s.empty();
37 }
38 
39 int main() {
40     string expression = "{[()]}";
41     if (isBalanced(expression)) {
42         cout << "符号匹配" << endl;
43     } else {
44         cout << "符号不匹配" << endl;
45     }
46     return 0;
47 }
符号匹配

 

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

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

相关文章

API方式开发AI应用的三点总结

1. 编程式prompt 让 AI 具备类似程序的运行逻辑。把大模型当CLR使用。与传统的角色扮演提示prompt相比,此方式所需的tokens数量更少,且输出结果的准确性更高 。示例如下:2. 语音对话(STT/TTS) 因为如今碎片化的时代,没多少人愿意看完一大篇文字内容,所以需要将AI生成的内…

五下数学第1单元练习情况反馈204班

五下数学第1单元练习情况反馈204班 本周进行了数学第1单元的综合练习,已经进行了讲评。试卷已经下发,请学生带回家改完错误,家长签字。 签字在试卷的左上角,签字示范:家长阅,2月28日,或者再写一些建议与意见都可以。 下面分析一下考试情况: 第1单元数学练习 下面是具体…

逆序对的解法——归并排序

题目来源:洛谷P8613小朋友排队(https://www.luogu.com.cn/problem/P8613) 题目大意为:给你一段序列,只允许相邻两个数交换,对于某个数,一次操作ans+1,第二次操作ans+2,以此类推。问让此序列排列成递增序列的ans最小值。 思路: 当一个数左边存在比它大的数时,一定需要交…

从红屏到断点,VSCode+Chrome打开调试vue.js项目的黄金配置公式,后端转前端必看!

夙夜小哥这几天有个项目前端人手不够,要我支援几天。我本人之前是写后端的,在支援的过程中发现前端对JavaScript或者typescript的方法提示以及代码导航功能都比较弱,可能是由于js本身属于弱类型语言,所以这波并不属于VSCode的锅。 但是我又发现好像VSCode不进行配置的话,没…

PCB绘制学习--嘉立创EDA专业版

PCB绘制学习--嘉立创EDA专业版 由于最近找工作四处碰壁,打算跟着大部分岗位的招聘要求学点东西起来,目前的计划是学习PCB绘制、STM32Cube开发工具以及HAL库的使用,FreeRTOS在STM32上的移植。同时还要做毕设,忙~ 做博客记录呢是觉得学了不记点笔记久了就跟没学过一样。 言归…

厂房AI火焰识别网络摄像机

厂房AI火焰识别网络摄像机通过深度学习算法,能够识别火焰的细微特征,即使在复杂环境背景下也能准确判断,在设计上借助传感器过滤掉图像上像火的物体,比如车尾灯,晚霞。算法帮助传感器过滤掉带有辐射的物体,比如人体,汽车尾气,太阳光等。使得误报率几乎不会存在,大大降低…

乱扔垃圾行为检测系统

乱扔垃圾行为检测系统基于YOLOX+RNN的深度学习算法,乱扔垃圾行为检测系统通过前端摄像头一旦检测到乱扔垃圾行为,系统会立即发出警报,通知相关人员及时处理,从而起到保障社会卫生的作用。本系统通过安装在垃圾桶周围的摄像头,实时监测垃圾桶内的垃圾量。当垃圾桶内的垃圾达…

现代CPU调优3: CPU 微架构

3 CPU CPU 微架构 本章简要概述了对软件性能有直接影响的关键 CPU 微体系结构特性。本章的目的并不是要涵盖 CPU 架构的所有细节和权衡,文献[Hennessy & Patterson, 2017 Computer Architecture, Sixth Edition]、[Shen & Lipasti, 2013 Modern Processor Design: Fun…

山体落石滑坡识别系统 落石泥石流监控摄像机

山体落石滑坡识别系统 落石泥石流监控摄像机基于YOLOX+RNN的深度学习算法,山体落石滑坡识别系统 落石泥石流监控摄像机通过安装在山区公路沿线的监控摄像机来实现对山体的实时监测。这些摄像机分布在关键位置,如山体易滑坡区域、桥梁附近等,能够24小时不间断地捕捉山体的动态…

MySQL语句查询——子查询和三表查询

一、子查询 1、定义:一个查询中嵌套另一个查询 2、子查询的分类 (1)标量子查询 (2)列子查询 (3)行子查询 (4)表子查询(运用多) 3、子查询详解 (1)标量子查询(返回一个值) -把一个sql 执行返回的一个值,作为另一个sql的条件,得到的结果是一行一列,一般出现在…

leetcode hot 14

解题思路:这题思路有很多,动态规划,前缀和等,前缀和就是遍历一遍,将每个前缀和与前面最小的前缀和相减,就能得到最大值,然后比较与记录最大值。(还有一种思路就是首先明确最大子串内部一定不会存在某个边缘子串小于0,所以可以遍历一遍先记录继续记录前缀和,然后比较ma…

如何在React.js中使用Shadcn/UI

如何在React.js中使用Shadcn/UI 学习如何在React.js中使用Shadcn/UI构建可自定义且轻量的界面。了解如何将其与Apipost集成,以实现高效的API管理和测试。非常适合希望提升React.js项目的开发者!使用Shadcn/UI构建现代化界面 创建简洁的用户界面是前端开发者的主要目标之一。随…