括号匹配性检测C语言实现
#include <stdio.h>
#define SIMPLE_KUOHAO "(()1231qeqw)(@#$)"
#define COMPLEX_KUOHAO "{(()[asd])}{{{{(((())))}}}}"
int main(int argc, const char * argv[])
{
/*问题描述:
假设一个算术表达式中可以包含三种括号:圆括号"(" 和
")",方括号"["和"]"和花括号"{"和"}",且这三种括号可按任意的
次序嵌套使用(如:…[…{…}…[…]…]…[…]…(…)…)。编写判别给定表达
式中所含括号是否正确配对出现的算法(已知表达式已存入数据元素
为字符的顺序表中)。
思路分析:
检验括号是否匹配的方法可以用“期待的急迫程度”这个概念来描述。
例如,考虑下列括号序列:
[ ( [ ] [ ] ) ]
1 2 3 4 5 6 7 8
当计算机接受了第一个括号后,它期待着与其匹配的第八个括号的出现,然而等来的却是第二个括号,此时第一个括号“[”只能暂时靠边,而迫切等待与第二个括号相匹配的、第七个括号“)”的出现,类似地,因等来的是第三个括号“[”,其期待匹配的程度较第二个括号更急迫,则第二个括号也只能靠边,让位于第三个括号,显然第二个括号的期待急迫性高于第一个括号;在接受了第四个括号之后,第三个括号的期待得到满足,消解之后,第二个括号的期待匹配就成为当前最急迫的任务了,……依此类推。
很显然,这样的一个处理过程和栈的特点非常吻合,因此,这个问题可以用栈来解决。
解决思路:
1.在算法中设置一个栈,每次读入一个括号;
2.若是右括号,则或者使置于栈顶的最急迫的期待得以消解,此时将栈顶的左括号弹出;或者是不合法的情况,此时将右括号压入;
3.若是左括号,则作为一个新的更急迫的期待压入栈中,自然使原有的在栈中的所有未消解的期待的急迫性都降低一级;
4.在算法的开始和结束时,栈应该为空。*/
//这里用的是C来做的,用结构体模拟了堆栈,当最后匹配完成后括号数组不为空(若用堆栈则匹配完成后堆栈应该为空),只是top下标为0
//注意类似这种的 {[}] 也会匹配失败 实际中也失败
//简单地括号匹配性检测(只有一种括号)
int jianceSimpleKuohao(char *str);//声明检测函数 返回1匹配成功 返回0匹配失败
char str[] = SIMPLE_KUOHAO;//要检测的字符串
int i = jianceSimpleKuohao(str);
if (i == 1) {
printf("匹配成功\n");
}
else
{
printf("匹配失败\n");
}
//简单地括号匹配性检测(有多种括号出现)
int jianceComplexKuohao(char *str);
char str2[] = COMPLEX_KUOHAO;
int j = jianceComplexKuohao(str2);
if (j == 1) {
printf("匹配成功\n");
}
else
{
printf("匹配失败\n");
}
return 0;
}
int jianceSimpleKuohao(char *str)
{
struct Stack {
char kuohao[100];//用于存放左括号
unsignedint top;//指示char kuohao[1]的下标
}stack;
stack.top = 0;
while (*str != '\0')//循环遍历字符串数组
{
if (*str == '(')
{
stack.kuohao[stack.top] = *str;
stack.top++;
//将出现的左括号 放入stack.kuohao[stack.top],并且下标+1 用堆栈来说就是每新出现一个左括号就将其压入栈 堆栈的top指针+1
}
else if (*str == ')')
{
if (stack.top > 0 && stack.kuohao[stack.top-1] == '(')
//stack.top > 0 防止右括号出现再第一位
//stack.kuohao[stack.top-1] == '('防止右括号出现在左括号的前边
{
stack.top--;
//如出现一个右括号stack.kuohao[]数组的下标-1 其实就是将离新出现的右括号最近的左括号退出栈
}
else
{
return 0;
}
}
str++;
}
printf("%d",stack.top);
return 1;
}
int jianceComplexKuohao(char *str)
{
struct SQLIST{
char elem[100];
unsigned int top;
} SqList; // 顺序表
SqList.top = 0;
while (*str != '\0') {
if (*str == '(' || *str == '[' || *str == '{') {
SqList.elem[SqList.top] = *str;
SqList.top++;
}
else if (*str == ')' || *str == ']' || *str == '}')
{
if (*str == ')') {
if (SqList.top > 0 && (SqList.elem[SqList.top - 1] == '(')) {
SqList.top--;
}
else
{
return 0;
}
}
if (*str == ']') {
if (SqList.top > 0 && (SqList.elem[SqList.top - 1] == '[')) {
SqList.top--;
}
else
{
return 0;
}
}
if (*str == '}') {
if (SqList.top > 0 && (SqList.elem[SqList.top - 1] == '{')) {
SqList.top--;
}
else
{
return 0;
}
}
}
str++;
}
printf("%d",SqList.top);
return 1;
}
括号匹配性检测C语言实现的更多相关文章
- 栈的应用:表达式括号匹配检测(C)
问题说明: 假设数学表达式中允许包含两种括号:圆括号"()"和方括号"[]",嵌套顺序任意. 正确的嵌套模式:( [ ] ( ) ).[ ( [ ] [ ] ) ...
- C语言数据结构之栈:括号匹配
括号匹配这是个很简单的题目,如果只有小括号,就模拟进栈和出栈的过程就行了: 注:输入时'@'作为结束标志 #include <stdio.h> int main() { freopen(& ...
- 一起talk C栗子吧(第二十回:C语言实例--括号匹配)
各位看官们,大家好.前几回中咱们说了堆栈的原理,而且举了实际的样例进行讲解,这一回咱们说的例 子是:括号匹配. 括号匹配使用了堆栈的原理,大家能够从样例看出来.所以我们把它们放在一起.闲话 休提.言归 ...
- C++学习(三十一)(C语言部分)之 栈和队列(括号匹配示例)
括号匹配测试代码笔记如下: #include<stdio.h> #include<string.h> #include <stdlib.h> #define SIZ ...
- 括号匹配(c语言实现)
⭐ 我的网站: www.mengyingjie.com ⭐ 1要求 编写程序检查该字符串的括号是否成对出现,而且不能交叉出现. 输入: 一个字符串,里边可能包含"()"." ...
- C++括号匹配检测(用栈)
输入一串括号,包括圆括号和方括号,()[],判断是否匹配,即([]())或[([][])]为匹配的正确的格式,[(])或([())为不匹配的格式. #include<iostream> # ...
- P1739_表达式括号匹配(JAVA语言)
思路:刚开始想用stack,遇到'('就push,遇到')'就pop,后来发现其实我们只需要用到栈里'('的个数,所以我们用一个变量统计'('的个数就好啦~ 题目描述 假设一个表达式有英文字母(小写) ...
- 利用栈实现括号匹配(python语言)
原理: 右括号总是与最近的左括号匹配 --- 栈的后进先出 从左往右遍历字符串,遇到左括号就入栈,遇到右括号时,就出栈一个元素与其配对 当栈为空时,遇到右括号,则此右括号无与之匹配的左括号 当最终右括 ...
- 华为笔试题--LISP括号匹配 解析及源码实现
在17年校招中3道题目AC却无缘华为面试,大概是华为和东华互不待见吧!分享一道华为笔试原题,共同进步! ************************************************ ...
随机推荐
- uoj#340. 【清华集训2017】小 Y 和恐怖的奴隶主(矩阵加速)
传送门 uoj上的数据太毒了--也可能是我人傻常数大的缘故-- 三种血量的奴隶主加起来不超过\(8\)个,可以枚举每种血量的奴隶主个数,那么总的状态数只有\(165\)种,设\(dp_{t,i,j,k ...
- ajax异步传输数据,return返回值为空
今天在项目中遇到了一个问题,就是在定义了一个函数drawHtml(),本意是想在函数运行结束后,返回拼接的字符串,可是函数运行结束后始终返回的是undefined 有BIG的代码: function ...
- Python学习笔记(异常处理)
用户输入了一个不合规定的值,或者需要打开的文件不存在.这些情况被称作“异常”,一个好的程序需要能处理可能发生的异常,避免程序因此而中断. 例如我们去打开一个文件: f = file('non-exis ...
- Java使用FFmpeg处理视频文件的方法教程
这篇文章主要给大家介绍了关于Java使用FFmpeg处理视频文件的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧 前言 本文主要 ...
- Photoshop CC 2014 for mac破解版
https://pan.baidu.com/s/1gfmTq8b 安装PS试用版后,打开Applications/Photoshop CC 2014文件夹下, 右键Photoshop CC 201 ...
- Netty(5)@Sharable
问题:我写了MyDecoder which extends ByteToMessageDecoder,单线程没问题,但是多线程时,报'the handler should be sharable'.查 ...
- 1.7hashmap并发成环
https://mp.weixin.qq.com/s?__biz=MzIxMjE5MTE1Nw==&mid=2653192000&idx=1&sn=118cee6d1c67e7 ...
- python实现批量远程执行命令及批量上传下载文件
#!/usr/bin/env python # -*- coding: utf- -*- # @Time : // : # @Author : xuxuedong # @Site : # @File ...
- mui的picker组件填坑
在公司项目用到mui,vue进行开发 import mui from './assets/js/mui.min.js'后 加window.mui = mui再 import './assets/js/ ...
- swift 第三方库迁移错误解决“Use Legacy Swift Language Version” (SWIFT_VERSION) is required to be configured correctly for targets which use Swift. Use the [Edit > Convert > To Current Swift Syntax…] menu to choo
先看看错误提示 这里Alamofire库报错,原因打开工程会Xcode会提示你覆盖到最新的3.0版本.但是仍然有些框架会出现一些问题 解决办法: 选择Pods - ReactiveCocoa - Sw ...