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

高分笔记_括号匹配

高分笔记-顺序栈的应用

2019-03-22 19:22:30


 

例题3-1:编写算法,判断一个表达式中的括号是否正确配对,表达式已经存入字符数组exp[]中,表达式中的字符个数为n

分析:

第一步:创建数学模型

设在exp括号串中,‘(’的个数为m;    ')'的个数为n

那么有一下三种情况:

m<n   <=>n-m>0 不匹配

m>n <=>n-m<0   不匹配

m=n <=>n-m=0    匹配

第二步:考虑用什么数据结构来操作它

由于我们是顺序遍历字符串exp的;当我们碰到一个')'来看一下是否有'('与它匹配;所以当碰到'('的时候,要把它存储起来,以后再用,通俗的来讲,我要把'('记忆下来!那么此时就应当想到栈!

我们在解决问题的过程中出现一个子问题,但凭现有条件不能解决它,需要记下来,等以后出现可以解决它的条件后再返回来解决。对于这种问题需要用到栈,栈具有记忆功能,这是栈的FIFO特性所延生出来的一种特性

第三步:确定好在数据结构后对数学模型的操作

算法:扫描字符串,碰到'('时,入栈;碰到')'出栈

操作:

1、m<n 时 当扫描到')'要求出栈时,栈中为空,没有'('与它匹配,此时return 0表示括号不匹配

2、m>n 时 扫描完字符串后,退出循环,栈不为空,说明没有')'与栈中的'('匹配,此时表示括号不匹配

3、m=n时 扫描完字符串后,栈为空,此时表示括号正确匹配

 

代码如下:

 1 #include <iostream>
 2 #include<cstring>
 3 #define maxSize 100 
 4 /* run this program using the console pauser or add your own getch, system("pause") or input loop */
 5 using namespace std;
 6 int match(char exp[],int n){
 7     char stack[maxSize];
 8     int top=-1;
 9     int i;
10     for(i=0;i<n;i++){
11         char ch=exp[i];
12         switch(ch){
13             case'(':
14                 stack[++top]=ch;
15                 break;
16             case')':
17                 if(top==-1)
18                     return 0;//表示此时不匹配 ')))'  和'(()))'这种两种情况 
19                 else
20                     top--;
21         }
22     }
23     //当括号串扫描结束后有一下两种情况 设'('的个数为m; ')'的个数为n 
24     //当扫描完毕后 只有一下两种情况 m>n时,栈不为空;m==n时栈为空;而当m<n是,在循环里面就会return 0;
25     if(top!=-1)
26         return 0;
27     else
28         return 1; 
29 }
30 int main(int argc, char** argv) {
31     char str[maxSize];
32     cout<<"请输入一个括号串,只由'('')'组成:"<<endl;
33     while(cin>>str){
34         int result=match(str,strlen(str));
35         if(result)
36             cout<<"匹配"<<endl;
37         else
38             cout<<"不匹配"<<endl;
39     }
40     return 0;
41 }

 

转载于:https://www.cnblogs.com/industrial-fd-2019/p/10580492.html

相关文章:

  • 2018-2019-2 《网络对抗技术》Exp2 后门原理与应用 20165211
  • 每日 30 秒 ⏱ 谁敢与我一战
  • 用Python爬取王者农药英雄皮肤
  • 杂记:Python 两坑
  • Sass预处理器常用功能(OneLine周分享)
  • Java程序设计第一次作业
  • mysql 原理 ~ 线程与IO
  • 牛客挑战赛30 简要题解
  • 【复习笔记】---java基础
  • 运维工作钱少、事多而且杂?年轻人,你这个思想很危险吶
  • centos7下关闭sshd的tcp6
  • Media Queries实现屏幕适配
  • SkyWalking Liunx 环境搭建NetCore接入
  • 死磕 java集合之HashMap源码分析
  • CocoaPods使用小结
  • 10个最佳ES6特性 ES7与ES8的特性
  • css系列之关于字体的事
  • Hexo+码云+git快速搭建免费的静态Blog
  • nfs客户端进程变D,延伸linux的lock
  • QQ浏览器x5内核的兼容性问题
  • React-flux杂记
  • Spark RDD学习: aggregate函数
  • vagrant 添加本地 box 安装 laravel homestead
  • 经典排序算法及其 Java 实现
  • 我从编程教室毕业
  • Oracle Portal 11g Diagnostics using Remote Diagnostic Agent (RDA) [ID 1059805.
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (七)理解angular中的module和injector,即依赖注入
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • (转)linux下的时间函数使用
  • (转)程序员疫苗:代码注入
  • ./configure,make,make install的作用(转)
  • .NET Core 中插件式开发实现
  • .net 程序发生了一个不可捕获的异常
  • .NET 读取 JSON格式的数据
  • .NET 解决重复提交问题
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • .NET 中让 Task 支持带超时的异步等待
  • /usr/bin/env: node: No such file or directory
  • [2016.7.Test1] T1 三进制异或
  • [Android]Tool-Systrace
  • [go] 迭代器模式
  • [hibernate]基本值类型映射之日期类型
  • [IE9] IE9 RC版下载链接
  • [Latex] \bibitem{} | .bbl 格式参考文献转换与获得
  • [LeetCode]-225. 用队列实现栈
  • [luogu2165 AHOI2009] 飞行棋 (枚举)