#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语言实现的更多相关文章

  1. 栈的应用:表达式括号匹配检测(C)

    问题说明: 假设数学表达式中允许包含两种括号:圆括号"()"和方括号"[]",嵌套顺序任意. 正确的嵌套模式:( [ ] ( ) ).[ ( [ ] [ ] ) ...

  2. C语言数据结构之栈:括号匹配

    括号匹配这是个很简单的题目,如果只有小括号,就模拟进栈和出栈的过程就行了: 注:输入时'@'作为结束标志 #include <stdio.h> int main() { freopen(& ...

  3. 一起talk C栗子吧(第二十回:C语言实例--括号匹配)

    各位看官们,大家好.前几回中咱们说了堆栈的原理,而且举了实际的样例进行讲解,这一回咱们说的例 子是:括号匹配. 括号匹配使用了堆栈的原理,大家能够从样例看出来.所以我们把它们放在一起.闲话 休提.言归 ...

  4. C++学习(三十一)(C语言部分)之 栈和队列(括号匹配示例)

    括号匹配测试代码笔记如下: #include<stdio.h> #include<string.h> #include <stdlib.h> #define SIZ ...

  5. 括号匹配(c语言实现)

    ⭐ 我的网站: www.mengyingjie.com ⭐ 1要求 编写程序检查该字符串的括号是否成对出现,而且不能交叉出现. 输入: 一个字符串,里边可能包含"()"." ...

  6. C++括号匹配检测(用栈)

    输入一串括号,包括圆括号和方括号,()[],判断是否匹配,即([]())或[([][])]为匹配的正确的格式,[(])或([())为不匹配的格式. #include<iostream> # ...

  7. P1739_表达式括号匹配(JAVA语言)

    思路:刚开始想用stack,遇到'('就push,遇到')'就pop,后来发现其实我们只需要用到栈里'('的个数,所以我们用一个变量统计'('的个数就好啦~ 题目描述 假设一个表达式有英文字母(小写) ...

  8. 利用栈实现括号匹配(python语言)

    原理: 右括号总是与最近的左括号匹配 --- 栈的后进先出 从左往右遍历字符串,遇到左括号就入栈,遇到右括号时,就出栈一个元素与其配对 当栈为空时,遇到右括号,则此右括号无与之匹配的左括号 当最终右括 ...

  9. 华为笔试题--LISP括号匹配 解析及源码实现

    在17年校招中3道题目AC却无缘华为面试,大概是华为和东华互不待见吧!分享一道华为笔试原题,共同进步! ************************************************ ...

随机推荐

  1. JSONPath中的表达式

    在JsonPath中使用表达式是一个非常好的功能,可以使用简洁和复杂的JsonPath.JsonPath中的表达式基本上是评估为布尔值的代码片段.基于结果,仅选择满足标准的节点.让我们看一下它的更多内 ...

  2. 【BZOJ2428】均分数据

    题解 先说说黄学长的做法: 当温度比较高的时候,贪心 每次随机一个数,把他放进当前和最少的那一组里面 温度足够低的时候就完全随机然后转移 对于一个排列,分组强制连续 答案显然唯一,做一遍(dp)就好 ...

  3. Luogu P2257 YY的GCD 莫比乌斯反演

    第一道莫比乌斯反演...$qwq$ 设$f(d)=\sum_{i=1}^n\sum_{j=1}^m[gcd(i,j)==d]$ $F(n)=\sum_{n|d}f(d)=\lfloor \frac{N ...

  4. python之is 和 == 的区别//编码和解码

    一.is  和  ==  的区别: 1  .id()   内存地址 2.  ==   比较    #比较两边的值 3.   is    比较   #比较的是内存地址 数字,字符串,有小数据池 #数字小 ...

  5. css中如何设置透明度

    怎样在CSS样式中设置背景的透明度,下面一个具体的实例.把类为box的层设为透明.<div class="box"></div><style>. ...

  6. TDH-大数据基础

    ------------------------------------------------------------------------------------*******大数据概念和基础* ...

  7. (译)Minimal Shader(最小的着色器)

    (原文:https://en.wikibooks.org/wiki/Cg_Programming/Unity/Minimal_Shader) This tutorial covers the basi ...

  8. 密码强度的正则表达式(JavaScript)总结

    简言 本文给出了两个密码强度的正则表达式方案,一个简单,一个更复杂和安全.并分别给出了两个方案的解析和测试程序.一般大家可以根据自己的项目的实际需要,自行定义自己的密码正则约定. 前言 用户注册时,都 ...

  9. js之深度克隆、简易克隆

    一.js中的对象 谈到对象的克隆,必定要说一下对象的概念. js中的数据类型分为两大类:原始类型和对象类型. (1)原始类型包括:数值.字符串.布尔值.null.undefined(后两个是特殊的原始 ...

  10. Appium基础四:Desired Capabilities详讲

    Desired Capabilities在启动session的时候是必须提供的,先看如下代码: Desired Capabilities本质上是key value的对象,他告诉appium serve ...