题目:

7-1 括号匹配 (30 分)
 

给定一串字符,不超过100个字符,可能包括括号、数字、字母、标点符号、空格,编程检查这一串字符中的( ) ,[ ],{ }是否匹配。

输入格式:

输入在一行中给出一行字符串,不超过100个字符,可能包括括号、数字、字母、标点符号、空格。

输出格式:

如果括号配对,输出yes,否则输出no。

输入样例1:

sin(10+20)

输出样例1:

yes

输入样例2:

{[}]

输出样例2:

no

分析:

通过详读题目以及例题我们可以知道:程序会读入随机输入的一串字符串,而当只有 '('和')' 、'['和']' 、 '{'和'}'相匹配的时候输出“yes”,其他情况都会输出“no”。

这时候我们可以采用顺序栈的结构来解决这一个问题:
将所有的左括号(即" ( 、[ 、{ ")存入栈中,遇到右括号(即" )、]、}")时出栈,再判断两者是否匹配。

代码:
#include<iostream>
#include<string.h>
using namespace std; //定义栈
#define max_size 200//栈的最大容量
typedef char datatype;
typedef struct{
datatype zhan[max_size];
int top;//栈顶
}stack; //栈的初始化
void initial(stack &st)
{
st.top = ;
} //类型为datatype的x入栈
void push(stack &st, datatype x)
{
//当栈顶和max_size相等时,栈满
if(st.top == max_size){
// cout<<"This stack has already full!";
cout<<"no";
exit();
}else{
st.zhan[st.top] = x;
st.top++;
}
} //出栈
char pop(stack &st){
if(st.top == ){
// cout<<"This stack is empty!";
cout<<"no";
exit();
}else{
st.top--;
return st.zhan[st.top];
}
} int main(){ stack s;
initial(s); /*输入字符串,并将字符串放到字符数组中,
实现能够逐个扫描字符串中的字符,并且不跳过空格符
*/
string str;
getline(cin, str);
char ch[]={'\0'};
strcpy(ch,str.c_str()); //flag标志状态 1为括号匹配,0为不匹配
int flag=;
int i;
for(i=; ch[i]!='\0'; i++){
//元素若为{,(,[则入栈
if((ch[i] == '{' )|| (ch[i] =='[') || (ch[i] =='(')){
push(s, ch[i]);
}//元素若为},),]则出栈 赋值给a
else if((ch[i] == '}') || (ch[i] ==']') || (ch[i] ==')')){
char a;
a = pop(s);
//若a与ch[i]匹配,进行下一个字符扫描
if((a == '{' && ch[i] == '}') || (a == '(' && ch[i] == ')') || (a == '[' && ch[i] == ']')){
continue;
}else flag = ;
}
} if(s.top != ){ //当左括号多出没有与右括号匹配的时候(如:" {() ")
flag =
} if(flag == ){
cout<<"no";
}else cout<<"yes";
return ;
}
 

 
编程过程中遇到的问题:
 
1.  在对字符串进行入栈操作时s.top(栈顶)的数值不增加,总为1
 
错误代码如下:
 
 
 
 
运行结果如下:
 
 
这段代码对于初学者来说看上去逻辑和操作过程似乎都没有问题,同时也困扰了我许久,
在参考了《数据结构(c语言版)》李云清等编著的教程后,我发现我犯了一个致命的低级错误:
编程push函数的时候,传入的参数为 stack st ,是不具有返回的功能,也就意味着在 push 函数中对于 st.top++ 这个操作没有更改主函数中st.top的数值。
 
 
修改代码如下:
 
将传入的参数为 stack st 改为 => 传入的参数为 stack &st,
当然,将它写成具有返回值的函数或者传入指针也是可行的。
 
 
 
2. 字符串入栈时,每个字符都入栈,没有通过是否为左括号(即" ( 、[ 、{ ")的判断
 
错误代码如下:
 
 
 
运行结果如下:
 
此运行结果为debug时设置的多点输出,数字均为 s.top ,加个a只是区分两个地方...
 
 
 
这样看我们的push函数!又似乎没有什么问题对不对!
 
但实际上if里面的语句是有问题的,受到多年数学的影响,判断是否为左括号,不能写成  "  ch[i] == '{' || '[' || '('  " ,
而需要修改为: "   (ch[i] == '{' )|| (ch[i] =='[') || (ch[i] =='(')   "
 
修改后代码:
 
那么另一个低级错误也就告一段落了...
可见基础中的基础的重要性啊!
 
 
 
3.  运行pop函数时,没有字符的返回
 
错误代码如下:
 
 
 
运行结果如下: 
 
第一个数字1为调用push后的flag , 第二个数字0为调用push和pop后的flag
 
 
 
 
 
从运行结果我们可以看到,理应出栈的 " ) " 和 " } "都是没有正常显示出来的,
也就是没有正常的返回给错误代码中的 datatype x 。
一开始我以为是在 函数传入形参的时候,利用引用值返回x 的这种方法并不行,于是我又将它改写成利用含有返回值函数返回我们需要的 x 这种方法(如上图错误代码所示)
但是结果都是一模一样的,这时候我就揪着这个函数看,很明显的,既然错误不在传入传出的参数中那么只能出现在if{....} 或 else{...}的语句中(显而易见,是在else{...}中)
bug也很容易看出来了,毕竟也就只有两句。
 
 
 
修改代码如下:
 
其实改完回来再看的时候也觉得很无语,第一个入栈的字符(有且只有一个入栈)是在 st.zhan[ 0 ]  中存放的,
而再错误代码中我首先pop出来的却是  st.zhan[ 1 ]  ,并没有这个字符,程序当然会出错啦。
 
 
 
 
 

总结:
 
在这种调用多个函数的这种题目中,debug 可能是最考验人意志力的一步了
最后再强调一遍: 
 
基础真的很重要!!!
 
&&
 
如有不正确的地方或有值得改进的地方,希望各位大佬指点一下。
:)

利用顺序栈解决括号匹配问题(c++)-- 数据结构的更多相关文章

  1. STL-stack和顺序栈实现括号匹配

    2018-11-11-14:28:31 1.顺序栈 下面是我用数组实现的顺序栈,包含的函数有出入栈,查看栈顶元素,栈的大小,栈是否空等函数,当栈空间不够用时,对应的数组会自动增长. /******** ...

  2. 《LeetBook》leetcode题解(20):Valid Parentheses[E]——栈解决括号匹配问题

    我现在在做一个叫<leetbook>的免费开源书项目,力求提供最易懂的中文思路,目前把解题思路都同步更新到gitbook上了,需要的同学可以去看看 书的地址:https://hk029.g ...

  3. HDU 4283 You Are the One ★(进出栈的括号匹配性质:区间DP)

    题意 有一个队列,每个人有一个愤怒值D,如果他是第K个上场,不开心指数就为(K-1)*D.但是边上有一个小黑屋(一个FILO堆栈),可以一定程度上调整上场程序,求一种安排上场方案使得所有人的不开心指数 ...

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

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

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

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

  6. Python面试题:使用栈处理括号匹配问题

    括号匹配是栈应用的一个经典问题, 题目 判断一个文本中的括号是否闭合, 如: text = "({[({{abc}})][{1}]})2([]){({[]})}[]", 判断所有括 ...

  7. 【js数据结构】栈解决括号不匹配问题

    栈可以用来判断一个算术表达式中的括号是否匹配. 思路:读取算术表达式,遇到左括号'{'.'['.'('压入栈,栈的特点是后入先出,所以当遇到右括号'}'.']'.')'的时候,取出栈顶元素,是否满足读 ...

  8. 栈之括号匹配问题(java实现)

    假设表达式中只允许两种括号:().{}:正确表达顺序为:()或{}或({})或{({}{})}的形势:如{(}或(})或({)}的表达形势均不对.算法的设计思想: 出现左括弧则进栈: 出现右括弧则首先 ...

  9. Python 用栈判断括号匹配

    #!/usr/bin/python # -*- coding: UTF-8 -*- from pythonds.basic.stack import Stack def parChecker(symb ...

随机推荐

  1. 从PFX文件中获取私钥、公钥证书、公钥

    https://blog.csdn.net/ZuoYanYouYan/article/details/77868584 该类具体功能:根据pfx证书得到私钥.根据私钥字节数组获取私钥对象.根据公钥字节 ...

  2. Python实例---爬去酷狗音乐

    项目一:获取酷狗TOP 100 http://www.kugou.com/yy/rank/home/1-8888.html 排名 文件&&歌手 时长 效果: 附源码: import t ...

  3. WPScan扫描Wordpress漏洞

    一.什么是Wpscan?什么是Wordpres? 1.Wpscan WPScan是一个扫描WordPress漏洞的黑盒子扫描器,可以扫描出wordpress的版本,主题,插件,后台用户以及爆破后台用户 ...

  4. windows Server 2008R2 FTP服务器搭建详细图解

    一.安装ftp服务 1.打开服务器管理器,如图: 2.右键点击角色,如图: 3.点击添加角色,会出现添加角色向导对话框,如图: 4.点击下一步,选择要添加的“web服务器(IIS)” ‘’ 5.点击下 ...

  5. C++中const和指针

    常见的理解问题: const char * * s;//表示s是指向const char * 类型的指针: char * * const s;//表示s是指向char * 类型的一个常量指针.

  6. MySQL 在各种程序语音的连接字符串(转)

    一.MySQL Connector/ODBC 2.50 (MyODBC 2.50)连接方式 1.本地数据库连接Driver={MySQL};Server=localhost;Option=16834; ...

  7. Django商城项目笔记No.7用户部分-注册接口-判断用户名和手机号是否存在

    Django商城项目笔记No.7用户部分-注册接口-判断用户名和手机号是否存在 判断用户名是否存在 后端视图代码实现,在users/view.py里编写如下代码 class UsernameCount ...

  8. SASS对css的管理

    一.SASS简介 SASS是一种CSS的开发工具,提供了许多便利的写法,大大节省了设计者的时间,使得CSS的开发,变得简单和可维护. 本文总结了SASS的主要用法.我的目标是,有了这篇文章,日常的一般 ...

  9. MySql详解(三)

    MySql详解(三) 导入基础表 具体的SQL文件已经放入百度网盘,连接为:http://pan.baidu.com/s/1hseoVR2,后面的MySql内容都是按照这些基础表展开的. depart ...

  10. Python3 下找不到urllib2的问题

    Python 3.* 用urllib.request来代替原来的urllib2,因此调用的时候改为: >>> import urllib.request >>> u ...