利用顺序栈解决括号匹配问题(c++)-- 数据结构
题目:
给定一串字符,不超过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 ;
}










利用顺序栈解决括号匹配问题(c++)-- 数据结构的更多相关文章
- STL-stack和顺序栈实现括号匹配
2018-11-11-14:28:31 1.顺序栈 下面是我用数组实现的顺序栈,包含的函数有出入栈,查看栈顶元素,栈的大小,栈是否空等函数,当栈空间不够用时,对应的数组会自动增长. /******** ...
- 《LeetBook》leetcode题解(20):Valid Parentheses[E]——栈解决括号匹配问题
我现在在做一个叫<leetbook>的免费开源书项目,力求提供最易懂的中文思路,目前把解题思路都同步更新到gitbook上了,需要的同学可以去看看 书的地址:https://hk029.g ...
- HDU 4283 You Are the One ★(进出栈的括号匹配性质:区间DP)
题意 有一个队列,每个人有一个愤怒值D,如果他是第K个上场,不开心指数就为(K-1)*D.但是边上有一个小黑屋(一个FILO堆栈),可以一定程度上调整上场程序,求一种安排上场方案使得所有人的不开心指数 ...
- 利用栈实现括号匹配(python语言)
原理: 右括号总是与最近的左括号匹配 --- 栈的后进先出 从左往右遍历字符串,遇到左括号就入栈,遇到右括号时,就出栈一个元素与其配对 当栈为空时,遇到右括号,则此右括号无与之匹配的左括号 当最终右括 ...
- C语言数据结构之栈:括号匹配
括号匹配这是个很简单的题目,如果只有小括号,就模拟进栈和出栈的过程就行了: 注:输入时'@'作为结束标志 #include <stdio.h> int main() { freopen(& ...
- Python面试题:使用栈处理括号匹配问题
括号匹配是栈应用的一个经典问题, 题目 判断一个文本中的括号是否闭合, 如: text = "({[({{abc}})][{1}]})2([]){({[]})}[]", 判断所有括 ...
- 【js数据结构】栈解决括号不匹配问题
栈可以用来判断一个算术表达式中的括号是否匹配. 思路:读取算术表达式,遇到左括号'{'.'['.'('压入栈,栈的特点是后入先出,所以当遇到右括号'}'.']'.')'的时候,取出栈顶元素,是否满足读 ...
- 栈之括号匹配问题(java实现)
假设表达式中只允许两种括号:().{}:正确表达顺序为:()或{}或({})或{({}{})}的形势:如{(}或(})或({)}的表达形势均不对.算法的设计思想: 出现左括弧则进栈: 出现右括弧则首先 ...
- Python 用栈判断括号匹配
#!/usr/bin/python # -*- coding: UTF-8 -*- from pythonds.basic.stack import Stack def parChecker(symb ...
随机推荐
- C++课堂作业_02_PAT1025.反转链表
The 1st classwork of the C++ program 题目:PAT.1025.反转链表 github链接:Click Here mdzz,做完题目的第一感受= = 这道题的题意就是 ...
- cpu的核心数及线程关系
CPU个数.核心数.逻辑CPU个数:一个物理CPU可以有多个核心,一个CPU核就是一个物理线程,由英特尔开发超线程技术可以把一个物理线程模拟出两个线程来使用,使得单个核心用起来像两个核一样,以充分发挥 ...
- php输出年份
Copyright <?php echo date('Y');?> by Creditease Corp.All Right Reserved.
- C内存开辟与平移
- c# winform 自动升级
winform自动升级程序示例源码下载 客户端思路: 1.新建一个配置文件Update.ini,用来存放软件的客户端版本: [update] version=2011-09-09 15:26 2.新 ...
- PHP foreach 循环使用"&$val" 地址符“&”
在熟悉项目代码的时候 看到这样的foreach 循环: foreach($data as &$val){ .... } 第一次看到循环里面使用了地址符“&”,我印象中的这个符号 是直接 ...
- ethjs-1-了解
https://github.com/ethjs/ethjs/blob/master/docs/user-guide.md Install npm install --save ethjs Usage ...
- tsconfig.json
概述 如果一个目录下存在一个tsconfig.json文件,那么它意味着这个目录是TypeScript项目的根目录. tsconfig.json文件中指定了用来编译这个项目的根文件和编译选项. 一个项 ...
- vue实例的属性和方法
vue实例的属性和方法 1. 属性 vm.$el #指定要绑定的元素 vm.$data #Vue 实例的数据对象 vm.$options #获取自定义属性的值 new Vue({ customOpti ...
- JSP中使用JDBC连接MySQL数据库的详细步骤
1,首先在自己新建的项目文本框中输入Web Project的名称,然后单击下一步. 2,继续单击下一步 3,把Generate web.xml deployment descriptor复选框勾上. ...