当前位置:首页 > C++目录 > 正文内容

【数据结构】栈—括号匹配检验

亿万年的星光5年前 (2021-02-21)C++目录21210

【题目描述】

假设表达式中允许包含两种括号:圆括号和方括号,其嵌套的顺序随意,如([ ]())或[  (  [  ] [  ] ) ] 等为正确的匹配,[  (  ]  )或 ([ ] ( )

或 (  ( ) ) )均为错误的匹配。

现在的问题是,要求检验一个给定的表示式中的括号是否正确匹配?

输入一个只包含圆括号和方括号的字符串,判断字符串中的括号是否匹配,匹配就输出“OK”,不匹配就 输出“wrong”。输入一个字符串:

[  ( [ ] [  ] ) ], 输出OK。

【输入描述】

输入仅一行字符(字符个数小于255)

【输出描述】

匹配就输出“OK”,不匹配就输出“wrong”

【样例输入】

[ ( ] )

【样例输出】

wrong

【题目分析与思路】

  1. 从样例中可以看出,匹配规则是从最内部(实际操作可以看成是栈顶)开始匹配。

  2. 按类型匹配,“[” 一定匹配“]”,可以考虑压栈的时候针对于不同的符号进行压栈操作。

  3. 可以用1,2,3,4来分别代表上面的符号




#include<iostream>
#include<stack>
#include<cstring> 
using namespace std;
char str[1000];
stack<int> S;
int main() {
	cin>>str;
    int len=strlen(str);
    for(int i=0;i<len;i++)
    {
        if(str[i]=='(')//记录左圆括号
            S.push(1);
        else if(str[i]==')')//记录右圆括号
        {
            if(S.empty())//栈为空
                S.push(2);
            else if(S.top()==1)
                S.pop();
            else
                S.push(2);
        }
        else if(str[i]=='[')//记录左方括号
            S.push(3);
        else if(str[i]==']')//记录右方括号
        {
            if(S.empty())//栈为空
                S.push(4);
            else if(S.top()==3)
                S.pop();
            else
                S.push(4);
        }
    }
    if(S.empty())
        printf("OK");
    else
        printf("Wrong");
    return 0;
}


扫描二维码推送至手机访问。

版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。

分享给朋友:

相关文章

C++中双冒号(::)的用法

一、作用域符号前面一般是类名称,后面一般是该类的成员名称,C++为例避免不同的类有名称相同的成员而采用作用域的方式进行区分如:A,B表示两个类,在A,B中都有成员member。那么A::member就...

Code::Blocks下载安装教程

Code::Blocks下载安装教程

Code::Blocks 是一款免费、开源且跨平台的 C/C++ 集成开发环境。它支持 Windows、Linux 和 macOS 等多种操作系统,核心特点是轻量快速、纯专注于 C/C++ 开发,并内...

常见的数据范围

一、总结名称字节位数(二进制)最小值最大值位数(十进制)bool18011char18shrot 216    (-2^15  到2^15  -1)-...

【图】并查集—优化

【图】并查集—优化

上一篇文章,简单介绍了并查集。这篇文章,介绍一下并查集的改进以及优化。find函数的优化(路径压缩)因为并查集的merge操作:void merge(int a, int...

图的访问与遍历-广度优先搜索

对于无向图的广度优先搜索#include <iostream> #include <vector> #include <queue>...

最小生成树—Prim(普里姆)算法

最小生成树—Prim(普里姆)算法

一、算法概述Prim 算法是一种用于求解加权无向连通图的最小生成树(MST) 的贪心算法。它从一个顶点开始,逐步扩展生成树,每次选择连接已选顶点集和未选顶点集的最小权重边。二、算法思想初始化:从任意顶...