括号匹配

总时间限制:1000ms 内存限制: 65536kB

描述

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

输入一串括号

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

输入

{{{{)))

输出

Brackets not match

样例输入

{([)]}

样例输出

Brackets not match


ps.优先匹配原则...

参考来源

ac代码

/*
@File     :   match_bracket_1.cpp
@Time     :   2020/03/25 20:16:07
@Desc     :   括号匹配(栈实现)
*/
#include <iostream>
#include <stdlib.h>
#define MAX_LEN 50

using namespace std;

//栈
typedef struct 
{
    char data[MAX_LEN];
    int top;
}Stack;
//初始化
void InitStack(Stack *&stack);
//压栈
bool Push(Stack *&stack, const char num);
//弹栈
bool Pop(Stack *&stack);
//栈是否为空
bool Empty(const Stack *stack);
//获取栈顶
bool get_top(const Stack *stack, char &top);
//判断代码
int JudgeCode(const string str);
int main(int argc, char const *argv[])
{
    string s;
    cin >> s;
    switch (JudgeCode(s))
    {
        case 1:
           cout << "Brackets match";
           break;
        case 2:
           cout << "Extra left brackets";
           break;
        case 3:
           cout << "Extra right brackets";
           break;
        case 4:
           cout << "Brackets not match";
           break;
     }
    system("pause");
    return 0;
}
void InitStack(Stack *&stack)
{
    stack = (Stack*)malloc(sizeof(Stack));
    stack->top = -1;
}
bool Push(Stack *&stack, const char num)
{
    if (stack->top == MAX_LEN - 1) return false;
    stack->top++;
    stack->data[stack->top]  = num;
    return true;
}
bool Pop(Stack *&stack)
{
    if (Empty(stack)) return false;
    stack->top--;
    return true;
}
bool Empty(const Stack *stack)
{
    return (stack->top == -1);
}
bool get_top(const Stack *stack, char &top)
{
    if (Empty(stack)) return false;
    top = stack->data[stack->top];
    return true;
}
int JudgeCode(const string str)
{                                       //括号匹配和回文匹配是不一样的
    Stack *stack;
    int l = 0, r = 0;
    char top;
    InitStack(stack);
    for (int i = 0; i < str.size(); i++) {
        if (get_top(stack,top)) {
            if ((top == '('&&str[i] == ')')||(top == '['&&str[i] == ']')||(top == '{'&&str[i] == '}')) Pop(stack);
            else Push(stack,str[i]);
        }
         else Push(stack,str[i]);
    }
   if (Empty(stack)) return 1;
   while (!Empty(stack)) {
       get_top(stack,top);
       if(top == '('||top == '['||top == '{') l++;
       if(top == ')'||top == ']'||top == '}') r++;
       Pop(stack);
   }
   if (l>0&&r==0) return 2;
   if (l==0&&r>0) return 3;
   if (l>0&&r>0)  return 4;
}
原文地址:https://www.cnblogs.com/levarz/p/12781521.html