合法括号【栈】

合法括号

发布时间: 2018年4月2日 20:46   时间限制: 1000ms   内存限制: 128M

描述

给定字符串,只包含以下括号:‘(‘, ‘)‘, ‘{‘, ‘}‘, ‘[‘ and ‘]‘ , 判断输入是否合法。括号匹配必按照要求:"()" and "()[]{}", 而不是 "(]" and "([)]"

输入

输入包含多组测试数据,每组测试数据占一行,不超过80个字符的字符串。

输出

对于每组测试数据,如果合法,输出true,否则false,每组输出占一行。

样例输入1

()()
((((({{{]]]]]]

样例输出1

true
false


#include <cstdio>
#include <cstring>
#include <stack>
#include <iostream>
#include <algorithm>
using namespace std;

stack<char>s;

int main()
{
    char str[100];
    while (scanf("%s", &str)!=EOF)
    {
        while (!s.empty())s.pop();
        int flag = 1;
        int len = strlen(str);
        for (int i = 0; i < len; i++)                //判断输入的字符串中是否有不符合标准的字符
        {
            if (str[i] == ‘(‘ || str[i] == ‘{‘ || str[i] == ‘[‘ || str[i] == ‘)‘ || str[i] == ‘}‘ || str[i] == ‘]‘)
                flag = 1;
            else
            {
                flag = 0;
                break;
            }
        }
        if (!flag)
        {
            printf("false\n");
            continue;
        }
        for (int i = 0; i < len; i++)
        {
            if (str[i] == ‘(‘ || str[i] == ‘{‘ || str[i] == ‘[‘)
            {
                s.push(str[i]);               //左括号就入栈
            }
            else if (str[i] == ‘)‘ || str[i] == ‘}‘ || str[i] == ‘]‘)            //如果是右括号,就看栈的顶端是否是和它配对的左括号
            {
                if (!s.empty())
                {
                    if (str[i] == ‘)‘)str[i] = ‘(‘;
                    else if (str[i] == ‘}‘)str[i] = ‘{‘;
                    else if (str[i] == ‘]‘)str[i] = ‘[‘;
                    if (s.top() == str[i])
                    {
                        s.pop();                    //如果匹配的话,就把左括号pop掉
                    }
                }
                else
                {
                    flag = 0;
                    break;
                }
            }
        }
        if (s.size())flag = 0;
        if (!flag)printf("false\n");
        else
            printf("true\n");
    }
    return 0;
}


2018-04-04

原文地址:https://www.cnblogs.com/00isok/p/8719076.html

时间: 2024-10-12 11:49:24

合法括号【栈】的相关文章

LongestValidParentheses, 求最长合法括号子串长度-----同类问题ValidParentheses,GenerateParentheses

问题描述:求括号字符串中最长合法子串长度.例如:()((),返回2,而不是4. 算法分析:还是利用栈,和判断合法括号对是一样的. 1 public static int longestValidParentheses(String s) { 2 Stack<int[]> stack = new Stack<int[]>(); 3 int result = 0; 4 5 for(int i=0; i<=s.length()-1; i++) 6 { 7 char c = s.ch

九度oj 题目1337:寻找最长合法括号序列

题目描述: 给你一个长度为N的,由’(‘和’)’组成的括号序列,你能找出这个序列中最长的合法括号子序列么?合法括号序列的含义便是,在这个序列中,所有的左括号都有唯一的右括号匹配:所有的右括号都有唯一的左括号匹配.例如:((()))()()便是一个长度为10的合法括号序列,而(()))( 则不是. 需要你求解的是,找出最长的合法括号子序列的长度,同时找出具有这样长度的序列个数. 输入: 测试数据包括多个,每个测试数据包含两行: 第一行为一个整数N,其中N不会超过10^6. 第二行为一个长度为N的字

九度oj 题目1342:寻找最长合法括号序列II

题目描述: 假如给你一个由’(‘和’)’组成的一个随机的括号序列,当然,这个括号序列肯定不能保证是左右括号匹配的,所以给你的任务便是去掉其中的一些括号,使得剩下的括号序列能够左右括号匹配且长度最长,即最长的合法括号序列. 输入: 测试数据包括多个,每个测试数据只有一行,即一个随机的括号序列,该括号序列的长度保证不超过106. 输出: 对于每个测试案例,输出一个整数,表示最后剩下的最长合法括号序列长度. 样例输入: (())() (() 样例输出: 6 2 这个题和1337求的是不一样的代码如下

[Jobdu] 题目1337:寻找最长合法括号序列

题目描述: 给你一个长度为N的,由’(‘和’)’组成的括号序列,你能找出这个序列中最长的合法括号子序列么?合法括号序列的含义便是,在这个序列中,所有的左括号都有唯一的右括号匹配:所有的右括号都有唯一的左括号匹配.例如:((()))()()便是一个长度为10的合法括号序列,而(()))( 则不是. 需要你求解的是,找出最长的合法括号子序列的长度,同时找出具有这样长度的序列个数. 输入: 测试数据包括多个,每个测试数据包含两行: 第一行为一个整数N,其中N不会超过10^6. 第二行为一个长度为N的字

python 题目:斐波那契数列计算;题目:站队顺序输出;题目:合法括号组合的生成;题目:用户登录(三次机会)

斐波那契数列计算 B 描述 斐波那契数列如下: F(0) = 0, F(1) = 1 F(n) = F(n-1) + F(n-2) 编写一个计算斐波那契数列的函数,采用递归方式,输出不超过n的所有斐波那契数列元素 调用上述函数,完成如下功能: 用户输入一个整数n,输出所有不超过n的斐波那契数列元素.输出数列的元素和及平均数,输出按照顺序,用英文逗号和空格分割 此题目为自动评阅,请严格按照要求规范输入和输出. def jebona(n): if n==0: return 0 elif n == 1

数据结构大师(求区间最长合法括号子序列)

数据结构大师 时间限制: 1 Sec 内存限制: 128 MB 题目描述 小$Z$是个数据结构高手,这天他得到了一个由左括号和右括号组成的字符串.随之而来的是 \(m\) 次询问,对于第 \(i\) 次询问,小Z需要回答出这个字符串的第$l_i$ 到$r_i$ 个字符组成的字串中最长的合法括号子序列的长度. 小$Z$认为一个由左右括号组成的序列$A$合法,当且仅当其满足至少一个以下条件. $A$为空. $A=(B)$其中$B$是一个合法的括号序列. \(A=BC\),其中$BC$都是合法的括号序

【LeetCode】Valid Parentheses合法括号

给定一个仅包含 '('.')'.'{'.'}'.'['.']'的字符串,确定输入的字符串是否合法. e.g. "()"."()[]{}"."[()]([]({}))" 是合法的,而"(]"."([)]" 是不合法的. 使用栈stack C++实现: 1 bool isValid(string s) { 2 stack<char> stack; 3 for (char &c : s) {

51nod 1791 合法括号子段

[题解] 我们可以发现每一对可以匹配的左右括号一定是一一对应的,那么我们用一个栈维护即可.如果当前是右括号,栈顶是左括号,那么一定有1的贡献,还要加上之前到达过top-1这个位置多少次,因为现在这一对括号可以和之前的那些组成更长的序列. 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #define LL long long 5 #define N 2200010 6 #define rg r

字符串练习(七):合法括号序列判断

对于一个字符串,请设计一个算法,判断其是否为一个合法的括号串. 给定一个字符串A和它的长度n,请返回一个bool值代表它是否为一个合法的括号串. 测试样例: "(()())",6 返回:true 测试样例: "()a()()",7 返回:false 测试样例: "()(()()",7 返回:false public class Parenthesis { public boolean chkParenthesis(String A, int n)