D1166:括号匹配

描述
假设表达式中只包含三种括号:圆括号、方括号和花括号,它们可相互嵌套,如([{}])或({[][()]})等均为正确的格式,而{[]})}或{[()]或([]}均为不正确的格式.

输入一串括号
如果输入的右括号多余,输出:Extra right brackets
如果输入的左括号多余, 输出:Extra left brackets
如果输入的括号不匹配,输出:Brackets not match
如果输入的括号匹配,输出:Brackets match
输入
{{{{)))
输出
Brackets not match
样例输入

{([)]}

样例输出

Brackets not match

思路:运用栈结构,左右括号输入时进行判定,并把匹配括号弹出,如果是左括号输入,如果为右括号弹出相应左括号,如果没有匹配括号就输入,计算剩余括号,如果只有右括号数为0,那么左括号剩余,只有左括号为0,那么右括号剩余,左右括号数都不为0,,那么括号不匹配。

代码:

#include
#include
using namespace std;
class Seqstack
{
        private:
                int top;
                char data[20];
        public:
                Seqstack(){top=-1;}
                void Push(char x){data[++top]=x;}
                void Pop(){top--;}
                char Gettop(){if(top!=-1)return data[top];}
                void Match(char a[],int i);
};
void Seqstack::Match(char a[],int i)
{
        int j,m=0,n=0;
        for(j=0;j<</SPAN>i;j++)
        {
                if(top!=-1)//第二个括号开始输入
                {
                        if(a[j]==‘(‘||a[j]==‘[‘||a[j]==‘{‘)
                        {
                                Push(a[j]);//如果为左括号输入
                        }
                        else if(a[j]==‘)‘||a[j]==‘]‘||a[j]==‘}‘)
                        {
                                if(Gettop()==‘(‘&&a[j]==‘)‘)
                                {
                                        Pop();

}
                                else if(Gettop()==‘[‘&&a[j]==‘]‘)
                                {
                                        Pop();
                                }
                                else if(Gettop()==‘{‘&&a[j]==‘}‘)
                                {
                                        Pop();
                                }//如果有相应左括号匹配右括号弹出
                                else
                                {
                                        Push(a[j]);
                                }//如果没有匹配的左括号输入
                        }
                }
                else if(top==-1)
                {
                        Push(a[j]);
                }//第一个括号输入
        }
        if(top==-1)
        {
                cout<<"Brackets match"<<endl;
        }//如果栈为空,括号匹配
        else
        {
                while(top!=-1)
                {
                        if(Gettop()==‘(‘||Gettop()==‘[‘||Gettop()==‘{‘)
                        {
                                m++;
                                Pop();
                        }//计算左括号数
                        else
                        {
                                n++;
                                Pop();
                        }//计算右括号数
                }
                if(m==0)
                {
                        cout<<"Extra right brackets"<<endl;
                }//如果左括号数为0,右括号剩余
                else if(n==0)
                {
                        cout<<"Extra left brackets"<<endl;
                }//如果右括号数为0,左括号剩余
                else
                {
                        cout<<"Brackets not match"<<endl;
                }//否则不匹配
        }
}
int main()
{
        Seqstack s;
        char a[20];
        cin>>a;
        int i=strlen(a);
        s.Match(a,i);
        return 0;
}

时间: 2024-08-02 01:24:07

D1166:括号匹配的相关文章

nyoj 括号匹配

这个方程有两种形式,本文采用 if(s[i]=s[j]) dp[i][j]=d[i-1][j-1] dp[i][j]=min(dp[i][k]+dp[k+1][j],dp[i][j]) (i=<k<j) 其实与另一种方法比较:根据j的所有匹配情况取最小值 1.i到j无匹配,取为dp[i][j-1]+1 2.列举所有匹配情况 dp[i][k-1]+dp[k+1][j] 取上述所有情况最小值 两者都能获得正确的结果. 同时两者的初始化为 dp[i][j]==1 if(i==j) 规划方向为:  

括号匹配问题(顺序栈实现)

本周老师作业留了两个.先上传一个吧.那个有时间我再传上来~ 本周的要求: 1.给出顺序栈的存储结构定义. 2.完成顺序栈的基本操作函数. 1)      初始化顺序栈 2)      实现入栈和出栈操作 3)      实现取栈顶元素和判空操作 括号匹配问题 3.编写主函数实现基本操作函数功能,并设置测试数据,测试合法和非法数据的输出结果. 4.程序调试运行并保存输出结果. 5.整理并提交实验作业. 1 #include <cstdio> 2 #include <cstring>

堆栈_括号匹配

class Solution { public: bool isValid(string s) { if(s.empty()) return false; stack<int> s1; int n=s.size(); for(int i=0;i<n;i++) { if(s[i]=='('||s[i]=='['||s[i]=='{') s1.push(s[i]); else if(s1.empty()) return false; else if((s[i]==')'&&s

括号匹配(二)

括号匹配(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:6 描述 给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起来.如:[]是匹配的([])[]是匹配的((]是不匹配的([)]是不匹配的 输入 第一行输入一个正整数N,表示测试数据组数(N<=10)每组测试数据都只有一行,是一个字符串S,S中只包含以上所说的四种字符,S的长度不

动态规划(2)--括号匹配(二)

括号匹配(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:6 描述给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起来.如:[]是匹配的([])[]是匹配的((]是不匹配的([)]是不匹配的 输入 第一行输入一个正整数N,表示测试数据组数(N<=10)每组测试数据都只有一行,是一个字符串S,S中只包含以上所说的四种字符,S的长度不超

行编辑程序、括号匹配检验

行编辑程序.括号匹配检验程序都是利用的栈的数据结构.而这两个 小程序也非常好的显示了栈先进后出的思想.由于程序本身很简短.清晰,所 以也就不做多的解释了,直接上代码了. 行编辑程序: #include<iostream> #include<stack> using namespace std; int main() { stack<char> sta; char ch = getchar(); while(ch!=EOF) { while(ch!=EOF&&am

题目1153:括号匹配问题(栈的使用)

题目链接:http://ac.jobdu.com/problem.php?pid=1153 详解链接:https://github.com/zpfbuaa/JobduInCPlusPlus // // 1153 括号匹配问题.cpp // Jobdu // // Created by PengFei_Zheng on 08/04/2017. // Copyright © 2017 PengFei_Zheng. All rights reserved. // #include <stdio.h>

栈的应用-判断括号匹配

栈的一个典型应用就是可以用来协助分析表达式的括号是否匹配.括号可以延伸到任何成对出现的界定符,例如引号,书名号等. 接下来给出程序实现: 第一部分给出的是堆栈的插入,删除等操作对应的实现: 1 public class StackChar 2 { 3 private int maxSize;//堆栈数组大小 4 private char [] stackArray; 5 private int top;//堆栈顶 6 public StackChar(int maxSize) 7 { 8 thi

集训第五周动态规划 J题 括号匹配

Description We give the following inductive definition of a “regular brackets” sequence: the empty sequence is a regular brackets sequence, if s is a regular brackets sequence, then (s) and [s] are regular brackets sequences, and if a and b are regul