题目2:括号配对问题

  • 描述
    现在,有一行括号序列,请你检查这行括号是否配对。
  • 输入
    第一行输入一个数N,表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有”[“,”]”,”(“,”)”四种字符
  • 输出
    每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No

  • 算法思想:
    括号匹配是数据结构——栈的一个简单运用。
    首先对输入字符串从左到右进行扫描,如果扫描到的是左括号“(”、”]“,则将其入栈;
    如果扫描到的是右括号“)”、“]”,则查找栈顶元素是否是与之匹配的左括号。
    如果是,则将栈顶元素弹出,继续扫描字符串的下一个字符;
    如果不是或者栈为空,则表明没有与之对应的左括号,终止扫描,跳出循环。
    最后,判断栈是否为空且字符串是否已经扫描到末尾’\0’,
    如果两者都成立,则表明括号匹配成功;
    否则,表明括号匹配失败。

  • 源代码(栈的所有操作附加上,所以代码有点冗余,其中栈是用C语言写的,故在头文件上加入了

#include <iostream>
#include <cstdlib>
#include <string>
#include <stdio.h>
using namespace std;

#define true 1
#define false 0

typedef struct Node{
    char data;
    struct Node *pNext;
}NODE,*PNODE;

typedef struct Stack
{
    PNODE pTop;
    PNODE pBottom;
}STACK, *PSTACK;

void init(PSTACK pS);
void push(PSTACK pS, int val);
void traverse(PSTACK pS);
int pop(PSTACK pS, int *val);
void clear(PSTACK pS);
int empty(PSTACK pS);

//栈的初始化
void init(PSTACK pS)
{
    pS->pTop = (PNODE)malloc(sizeof(NODE));

    if (NULL == pS->pTop)
    {
        printf("动态内存分配失败!");
        exit(-1);
    }
    else
    {
        pS->pBottom = pS->pTop;
        pS->pTop->pNext = NULL;
    }

    return;
}

//插入元素到栈顶
void push(PSTACK pS, char val)
{
    PNODE pNew = (PNODE)malloc(sizeof(NODE));

    pNew->data = val;
    pNew->pNext = pS->pTop;
    pS->pTop = pNew;

    return;
}

//遍历栈S
void traverse(PSTACK pS)
{
    PNODE p = pS->pTop;

    printf("栈内元素为:");
    while (p != pS->pBottom)
    {
        printf("%c\t", p->data);
        p = p->pNext;
    }

    printf("\n");
    return;
}

//判断栈是否为空
int empty(PSTACK pS)
{
    if (pS->pTop == pS->pBottom)
    {
        return true;
    }
    else
        return false;
}

//删除栈顶元素并将其值赋给*val
int pop(PSTACK pS, char *val)
{
    if (empty(pS))
    {
        return false;
    }
    else
    {
        PNODE r = pS->pTop;
        *val = r->data;
        pS->pTop = r->pNext;
        free(r);
        r = NULL;
    }
    return 0;
}

//获取栈顶元素
int gettop(PSTACK pS)
{
    if (empty(pS))
    {
        return false;
    }
    else
    {
        PNODE r = pS->pTop;
        return (r->data);
    }
}

//清空栈S
void clear(PSTACK pS)
{
    if (empty(pS))
    {
        return;
    }
    else
    {
        PNODE p = pS->pTop;
        PNODE q = NULL;

        while (p != pS->pBottom)
        {
            q = p->pNext;
            free(p);
            p = q;
        }

        pS->pTop = pS->pBottom;

        return;
    }
}

int main()
{
    int N;
    string str;
    STACK s;
    char ch;
    cin >> N;
    init(&s);
    while (N--)
    {
        int i;
        clear(&s);
        cin >> str;
        for ( i = 0; str[i] != '\0'; i++)
        {
            if (str[i] == '[' || str[i] == '(')
            {
                push(&s,str[i]);
            }
            else if (str[i] == ']' && gettop(&s) == '[')
            {
                pop(&s,&ch);
            }
            else if (str[i] == ')' && gettop(&s) == '(')
            {
                pop(&s, &ch);
            }
            else
            {
                break;
            }
        }
        if (str[i] == '\0' && empty(&s))
        {
            cout << "Yes" << endl;
        }
        else
        {
            cout << "No" << endl;
        }
    }
    return 0;
}
  • 心得
    程序很简单,调试的时候挺二货的,本地调试成功,测试也成功,提交就出现Wrong answer。仔细查看题目,发现原来是输出大小写没注意。浪费了十几分钟!!!
    原文作者:括号匹配问题
    原文地址: https://blog.csdn.net/qq_25245961/article/details/77460588
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞