-
2021-02-28 19:47:51
设计思路:
(1) 如果是左括号则压入栈中。
(2) 如果是右括号,则将一个左括号从栈中弹出,匹配一对。若此时栈中无元素,那么这个右括号没有匹配的左括号。
最后,如果栈不为空,则有左括号没有匹配。- 首先用编写函数isLeft(),isRight()来找出字符串中的左括号和右括号。
bool isLeft(char c) { return c=='(' || c=='[' || c=='{'; }
bool isRight(char c) { return c==')' || c==']' || c=='}'; }
- 再编一些函数getSignal()函数用来将右括号转换成左括号,以实现左右括号匹配。
char getSignal(char c) { switch(c) { case ')':return '('; case ']':return '['; case '}':return '{'; } }
judge()函数实现将字符串中的左括号压入栈中,再将右括号与左括号进行匹配,循环结束后栈为空则匹配,反之不匹配。
bool judge(char* statement) { char stack[stackSize]; int top = 0; //栈顶 for(int i = 0;statement[i]!='\0';i++) { if(isLeft(statement[i])) { if(top==stackSize-1) return false; //栈溢出 stack[top++] = statement[i]; //入栈 } else if(isRight(statement[i])) { char signal = getSignal(statement[i]); if(top==0) return false; //无左侧括号匹配 else if(signal ==stack[top-1]) top--; else return false; } } if (top==0) return true; //栈已空,匹配成功 else return false; } int main() { char statement [stackSize]; while(cin>>statement) { if(statement[0] == '/0')break; if(judge(statement))cout<<"YES"<<endl; else cout<<"NO"<<endl; } return 0; }
更多相关内容 -
实习二之括号配对_括号配对C++代码_
2021-10-01 18:57:09数据结构练习-括号配对C++代码,可实现表达式中括号自动配对检查等功能 -
表达式括号匹配C++
2021-08-13 18:47:58请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则返回“YESYES”;否则返回“NONO”。表达式长度小于255255,左圆括号少于2020个。 【输入】 一行数据,即表达式。 【输出】 一行,即“YESYES”...【题目描述】
假设一个表达式有英文字母(小写)、运算符(+,—,∗,/)和左右小(圆)括号构成,以“@”作为表达式的结束符。请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则返回“YES”;否则返回“NO”。表达式长度小于255,左圆括号少于20个。
【输入】
一行数据,即表达式。
【输出】
一行,即“YES” 或“NO”。
【输入样例】
2*(x+y)/(1-x)@
【输出样例】
YES
【提示】
【样例输入2】
(25+x)*(a*(a+b+b)@
【样例输出2】
NO
代码(第一种方法):
【思路点拨】
统计有多少个圆括号只有‘(’,如果一有‘)’那么‘(’就有了另一边,直接把统计的‘(’的数量减一,最后判断是不是没有单个的‘(’或‘)’。
#include<bits/stdc++.h> using namespace std; int main(){ char a[255]; int n=0; cin>>a; int i=0; while(true){ if(a[i]=='@')break; if(a[i]=='(')n++; if(a[i]==')')n--; i++; } if(n==0){ cout<<"YES"; }else{ cout<<"NO"; } }//既然看了我的代码,就点个赞呗(不多,就一个赞)!!!
【代码】(第二种方法):
【思路点拨】
把所有的‘(’统计起来放进栈n里,再把‘)’统计起来放进栈m里,比较两个栈的元素的数量是否相等,简单的说就是‘(’的数量与‘)’的数量是否相等。
#include<bits/stdc++.h> using namespace std; int main(){ stack<char> n,m; char a[255],b; int c=0,d,i=0; cin>>a; while(1){ if(a[i]=='@')break; if(a[i]=='(')n.push(a[i]); if(a[i]==')')m.push(a[i]); i++; } c=n.size(); d=m.size(); if(c!=d){ cout<<"NO"; }else{ cout<<"YES"; } }//既然看了我的代码,就点个赞呗(不多,就一个赞)!!!
-
括号匹配C++
2015-12-05 00:41:15括号匹配:判断一段字符串括号是否匹配,就是左括号是否与右括号搭配,且括号类型要相同,且有空字符串,括号套括号等特殊情况。 -
c++括号匹配
2014-12-05 15:26:05c++括号匹配 -
括号匹配(c++)
2021-10-05 16:34:1420. 有效的括号(力扣) 给定一个只包括 '(',')','{','}','[',']'的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 示例 1: ...20. 有效的括号(力扣)
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()"
输出:true
示例 2:输入:s = "()[]{}"
输出:true
示例 3:输入:s = "(]"
输出:false
示例 4:输入:s = "([)]"
输出:false
示例 5:输入:s = "{[]}"
输出:true来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses
思路一(利用栈)
对字符串从左到右进行处理
如果是左括号(包括 ( , [ , { ),则入栈;
如果是右括号,则判断栈顶元素是否与右括号匹配
- 栈空,右括号无法匹配--则直接可以得到结果--false
- 栈顶元素与右括号不匹配--则直接可以得到结果--false
- 栈顶元素与右括号匹配--则弹出栈顶元素
处理完字符串后,再判断栈是否为空
- 栈空--说明字符串中的左右括号刚好匹配
- 栈不空--说明左括号有剩余
class Solution { public: bool isValid(string s) { stack<char> v; for (int i = 0; i < s.size(); i++) { if (s[i] == '(' || s[i] == '[' || s[i] == '{') { v.push(s[i]); } else if (s[i] == ')' || s[i] == ']' || s[i] == '}') { if (v.empty()) { return false; } switch (s[i]) { case ')': { if (v.top() == '(') { v.pop(); } else return false; break; } case ']': { if (v.top() == '[') { v.pop(); } else return false; break; } case '}': { if (v.top() == '{') { v.pop(); } else return false; break; } } } } if (v.empty()) return true; else return false; } };
题目
问题描述
现在,有一行括号序列,请你检查这行括号是否配对。
输入
第一行输入一个数N
输出
每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No
样例输入 复制
3 [(]) (]) ([[]()])
样例输出 复制
No No Yes
解法二(利用数组)
感觉我好像写复杂了
#include<iostream> #include<string> #include<cstring> using namespace std; bool f(char a, char b) { if (( a == '(' && b == ')' )|| (a == '{' && b == '}') || ( a == '[' && b == ']')) return true; else return false; } int main() { char ch[100]; int n; cin >> n; while (n--) { ch[0] = '1'; cin >> &ch[1]; int len = strlen(ch); for (int i = 2; i <=len; i++) { while(f(ch[i-1],ch[i])==true) { for (int j = i - 1; j <=len - 1; j++) //括号匹配时--覆盖匹配的元素 { ch[j] = ch[j + 1]; } ch[len-1] = '\0'; //处理字符串结尾 len--; //数组长度减小 if (i == 0) { cout << "YES" << endl; break; } for (int j = i - 1; j <=len - 1; j++) { ch[j] = ch[j + 1]; } ch[len-1] = '\0'; //处理字符串结尾 len--; i--; } } if (strlen(ch) == 1) cout << "Yes" << endl; else cout << "No" << endl; } return 0; }
-
c++使用堆栈实现括号匹配问题
2018-11-13 14:53:21c++使用堆栈实现括号匹配问题 -
C++ 栈的括号匹配
2022-02-17 11:13:53匹配不成功的三种情况:(1)读取右括号时,此时栈空,没有与之匹配的左括号。(2)读取右括号时,弹出的栈顶左括号与之不匹配。(3)顺序读取括号后,栈不为空,即有括号未被匹配。 代码实践 /* 栈的括号匹配 */ #...总结归纳
- 算法思想: 设置一个空栈,顺序读取括号。读取左括号时,将括号入栈;读取右括号时,弹出栈顶元素,栈顶即是与之匹配的最近的左括号。
- 匹配不成功的三种情况:(1)读取右括号时,此时栈空,没有与之匹配的左括号。(2)读取右括号时,弹出的栈顶左括号与之不匹配。(3)顺序读取括号后,栈不为空,即有括号未被匹配。
代码实践
/* 栈的括号匹配 */ #include <iostream> #define MaxSize 10 // 栈中元素的最大个数 using namespace std; typedef char ElemType; // 栈的结构 struct SqStack { ElemType data[MaxSize]; // 静态数组存放栈顶元素 int top; // 栈顶指针 }; // 初始化栈 void InitStack(SqStack &S) { S.top = -1; } // 判断栈空 bool StackEmpty(SqStack S) { if (S.top == -1) { return true; } else { return false; } } // 入栈 bool Push(SqStack &S, ElemType x) { if (S.top == MaxSize - 1) { return false; } else { S.top++; S.data[S.top] = x; // S.top指向栈顶 return true; } } // 出栈 bool Pop(SqStack &S, ElemType &x) { if (S.top == -1) { // 栈空 return false; } else { x = S.data[S.top--]; // 先赋值再-- return true; } } // 括号匹配 bool BracketMatch(char str[], int len) { SqStack S; InitStack(S); for (int i = 0; i < len; i++) { if (str[i] == '(' || str[i] == '[' || str[i] == '{') { Push(S, str[i]); // 扫描到左括号,入栈 } else { if (StackEmpty(S)) { // 扫描到右括号且当前栈空 return false; } char topElem; Pop(S, topElem); // 栈顶元素出栈 if (str[i] == ')' && topElem != '(') { return false; } if (str[i] == ']' && topElem != '[') { return false; } if (str[i] == '}' && topElem != '{') { // 弹出的括号与遍历的括号不匹配 return false; } } } return StackEmpty(S); // 括号全部匹配完后,栈空为成功 } // 获取字符串数组长度 int GetLength(char str[]) { int i = 0; while (str[i] != '\0') { i++; } return i; } int main() { char str[MaxSize]; cin >> str; int len = GetLength(str); bool result = BracketMatch(str, len); cout << result << endl; return 0; }
-
C++实现括号匹配
2019-08-12 10:04:59位置0和位置10的右括号匹配,位置3的左括号和位置7的有括号匹配。 2.求解策略 如果从左至右地扫描一个字符串,那么每一个右括号都与最近扫描的那个未匹配的左括号相匹配。从左到右地扫描过程中,将扫描到的左括号... -
C++括号匹配问题
2020-05-27 12:26:354.遍历结束后判断栈是否为空:若为空则匹配,不为空不匹配 bool isMatch(string str) { //1.建立一个栈 Stack<char> s; //2.遍历字符串 for(int i=0;i<str.length();i++) { //2.1如果当前 -
利用栈实现括号匹配 c++
2019-05-06 19:38:04对于一个括号的序列,例如 {[()]} ,当我们从左向右遍历时,如果要确定右括号所对应的左括号是否存在,就需要将左括号记录下来,并且要做到最先记录的符号的最后被匹配,那么最合适的数据结构就是栈了。 算法过程 ... -
P1739 表达式括号匹配 C++题解
2020-07-16 10:53:04//出栈 } else if(b==')'&&a.empty()==1){//如果是右括号且栈空了(没有与之相匹配的左括号) cout;//不可能了 return 0;//完美收尾 } } 最后判断不解释 if(a.empty()==1){ cout; } else{ cout; } return 0; } 写... -
括号匹配(C++数据结构)
2018-08-07 14:11:10括号匹配(C++数据结构) 描述:给出由()、{}、[]三种类型括号所组成的字符串,判断所给字符串中的括号能否全部匹配,若能匹配,则输出true!,否则输出false! 输入输出示例 输入 ({}) ([{]) 输出 true! ... -
括号匹配 C++程序
2011-04-18 17:32:53括号匹配 C++程序 Status is_left(char ch){ if(ch=='('||ch=='['||ch=='{') return TRUE; else return FALSE; } Status is_right(char ch){ if(ch==')'||ch==']'||ch=='}') return TRUE; else return FALSE; ... -
c++ :括号匹配
2019-01-05 15:02:41c++ :括号匹配 题目描述 假设一个算术表达式中可以包含三种括号:圆括号“(”和“)”,方括号“[”和“]”和花括号“{”和“}”,且这三种括号可按任意的次序嵌套使用(如:…[…{… …[…]…]…[…]…(…)…)。... -
C++实现一个简单的括号匹配
2021-04-25 11:24:33如下所示,这是一个简单的括号匹配: #include<iostream> #include<cstring> using namespace std; class stack { private: int maxsize; char * st; public: int top; stack(int size) { ... -
栈的应用 括号匹配 c++
2022-03-03 11:48:03在算术表达式中,除了加、减、乘、除等运算外,往往还有括号。包括有大括号{},中...这次就用c++的栈来实现括号匹配 vs2017 //括号匹配 #include<iostream> using namespace std; #include<stack> #in -
C++中用栈来判断括号字符串匹配问题的实现方法
2020-09-04 05:45:26主要介绍了C++中用栈来判断括号字符串匹配问题的实现方法,是一个比较实用的算法技巧,包含了关于栈的基本操作,需要的朋友可以参考下 -
括号配对问题
2018-12-28 00:04:56括号配对问题C++,C++语言括号匹配问题解决方法,给定一个输入的字符串,包含括号(和),能够找出(和)的个数,并指出(或者)不正确的位置。 -
括号匹配c++算法
2021-11-26 00:14:36void function(string str) {//判断给定括号是否匹配 int L, R, i;//L表示左括号,R表示右括号 stackS; L = R = i = 0; while (str[i] != ‘\0’) { if (!S.empty()) L = S.top(); switch (str[i]) { case ‘{’: R ... -
括号匹配c++
2019-03-12 08:50:08这题主要做法是 左括号入栈,遇到右括号 从栈里取出和栈.top匹配, #include&lt;iostream&gt; #include&lt;stack&gt; #include&lt;cstdlib&gt; #include&... -
数据结构--c++实现括号匹配
2021-05-11 12:25:40输入一串括号字符串,从左往右扫描,若遇到左括号则入栈,若遇到右括号则从栈顶出栈一个括号(肯定是左括号),然后与其匹配。 代码实现 #include<iostream> #include<string> using namespace std; const ... -
C++括号匹配代码实现
2019-02-20 22:17:58#include <iostream> #include <cstring> ...//判断括号是否匹配 bool isMatch(string s) { stack<char> st; int len = s.size(); for (int i = ... -
括号匹配C语言
2018-12-05 20:55:343利用栈的操作实现括号匹配的检验。 .括号匹配算法思想 (1)出现的凡是“左括号”,则进栈; (2)出现的是“右括号”, 首先检查栈是否空? 若栈空,则表明该“右括号”多余 否则和栈顶元素比较? 若相... -
C++ 栈的应用:括号匹配
2019-01-08 17:00:24一、思路 1.先用字符数组或者string存储输入...然后,判断字符数组中存储的括号是什么括号: 如果是左括号,则进栈; 如果是右括号: 栈空,则匹配不成功; 栈不空,取出当前栈顶元素进行匹配: ... -
c++ 之 括号匹配(栈)
2022-01-03 21:45:48其实这个代码我一好几天前就开始写了,一开始用c写,但是发现用c写一个正解应该用栈解决的c++问题对于一个焫鷄来讲就好比刚学会汉语拼音然后让你写英语作文的感觉,唉,今天就转手用c++来写。 栈还没大学明白,只... -
括号匹配问题 C++实现
2019-04-19 16:53:20问题描述: 给定一个字符串,里边可能...括号匹配问题是典型的数据结构“栈”应用问题。 栈介绍:栈是一种特殊的线性表,仅能在线性表的一端操作,栈顶允许操作,栈底不允许操作。 栈的特性:后进先出(LIFO) ... -
括号匹配的检验(C++数据结构)
2009-11-19 19:15:13任意输入一个由若干个圆括号、方括号和花括号组成字符串,设计一个算法判断该串中的括号是否配对。