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

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

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

【题目描述】

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

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

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

输入一个只包含圆括号和方括号的字符串,判断字符串中的括号是否匹配,匹配就输出“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;
}


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

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

    分享给朋友:

    相关文章

    字符串的输入输出汇总

    做字符串的题目的时候,经常会遇到输入输出不对的情况,这篇文章就简单总结一下字符串常见的输入输出。2.cin基本操作:#include<iostream> #include<cstd...

    C++ 中的常量

    C++ 中的常量

    一、说明常量和变量是相对的概念 —— 变量是 “能变化的量”,而常量就是一旦定义就固定不变、不能修改的值。用生活里的例子类比,你就能秒懂为什么需要常量:本质是 “给固定不变的东西贴‘只读标签’,避免误...

    【算法】单链表的一些操作(存取、查找、取出、插入、删除)

    一、单链表结构的建立与输出#include<iostream> using namespace std; struct Node{ int ...

    第十四届全国青少年信息学奥林匹克联赛初赛试题(NOIP2008年普及组初赛C++试题及参考答案)

    第十四届全国青少年信息学奥林匹克联赛初赛试题(NOIP2008年普及组初赛C++试题及参考答案)

    第十四届全国青少年信息学奥林匹克联赛初赛试题             ...

    【题解】均分纸牌

    【题目描述】有n堆纸牌,编号分别为 1,2,…, n。每堆上有若干张,但纸牌总数必为n的倍数。可以在任一堆上取若干张纸牌,然后移动。移牌规则为:在编号为1的堆上取的纸牌,只能移到编号为 2 的堆上;在...

    取模运算总结——数论

    编程竞赛有相当一部分题目的结果过于庞大,整数类型无法存储,往往只要求输出取模的结果。例如(a+b)%p,若a+b的结果我们存储不了,再去取模,结果显然不对,我们为了防止溢出,可以先分别对a取模,b取模...