0
点赞
收藏
分享

微信扫一扫

括号匹配 (经典问题.LZZDS)

老罗话编程 2022-03-11 阅读 88
c++

括号匹配

描述

假设表达式中允许包含圆括号和方括号两种括号,其嵌套的顺序随意,如([]())或[([][])]等为正确的匹配,[(])或([]()或(()))均为错误的匹配。本题的任务是检验一个给定表达式中的括号是否正确匹配。输入一个只包含圆括号和方括号的字符串,判断字符串中的括号是否匹配,匹配就输出“OK”,不匹配就输出“Wrong”。

输入

一行字符,只含有圆括号和方括号,个数小于 255。

输出

匹配就输出一行文本“OK”,不匹配就输出一行文本“Wrong”。

输入样例 1 

[(])

输出样例 1

Wrong

对于此问题,我用的是最为传统的栈思想。手写栈的好处有很多,便于修改或便于添加,所以这里我选择的是手写栈。

先来简单介绍一些思路:

假设有括号:( [ ) ]

先进行设栈,这里就用 a 来进行。再写入括号。

最重要的一步来了:进行判断。

字符s:( [ ) ] 

下标i: 0123

设i为下标,从0到3遍历。

若s[i]是 “(” 或是 “[” 就无条件压入栈a,将栈a下标++top。

若s[i]是 “)” 就判断。若a[top]==“(”,则将top--。(下次++top就会覆盖掉 “)”) 。

若a[top]!="(",则将记录的f(原为0)为1,直接break。

若s[i]是 “]” 就判断。若a[top]==“[”,则将top--。(下次++top就会覆盖掉“[”) 。

若a[top]!="[",则将记录的f为1,直接break。

循环结束。

最后判断:

若 f 为 1,则输出Wrong。

若 f 为 0,则输出OK。

完成

附上代码:

#include<iostream>
#include<cstring>
#include<string>
using namespace std;
int main(){
    string a[260];
    int top=-1;
    string s;
    cin>>s;
    int f=0;
    for(int i=0;i<s.size();i++){
        if(s[i]=='(' || s[i]=='['){
            a[++top]=s[i];
        }
        if(s[i]==')'){
            if(a[top]=="("){
                top--;
            }else{
                f=1;
                break;
            }
        }
        if(s[i]==']'){
            if(a[top]=="["){
                top--;
            }else{
                f=1;
                break;
            }
        }
    }
    if(f==1){
        cout<<"Wrong";
        return 0;
    }
    if(f==0){
        cout<<"OK";
    }
    return 0;
}

如果有更好的思路,欢迎留言!!

举报

相关推荐

0 条评论