数据结构实验之栈与队列四:括号匹配

Problem Description

 给你一串字符,不超过50个字符,可能包括括号、数字、字母、标点符号、空格,你的任务是检查这一串字符中的( ) ,[ ],{ }是否匹配。

 

Input

 输入数据有多组,处理到文件结束。

 

Output

 如果匹配就输出“yes”,不匹配输出“no”

 

Sample Input

sin(20+10)
{[}]

Sample Output

yes
no

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define stackmax 10000
#define stacknum 10000
typedef int Elemtype;
typedef struct
{
    Elemtype *base;
    Elemtype *top;
    int stacksize;
}Sqstack;
void Initstack(Sqstack *S)
{
    S->base=(Elemtype *)malloc(stackmax*sizeof(Elemtype));
    if(!S->base) exit(0);
    S->top=S->base;
    S->stacksize=stackmax;
}//栈的初始化
void Push(Sqstack *S,char n)
{
    if(S->top-S->base>=S->stacksize)
    {
        S->base=(Elemtype *)realloc(S->base,(S->stacksize+stacknum)*sizeof(Elemtype));
        if(!S->base) exit(0);
        S->top=S->base+S->stacksize;
        S->stacksize=S->stacksize+stacknum;
    }
    *(S->top)=n;//栈顶元素先赋值
    S->top++;//栈顶指针加一,栈顶指针上移
}//入栈操作
char Pop(Sqstack *S)
{
    char e;
    if(S->top==S->base) return -1;
    e=*(S->top-1);
    S->top--;
    return e;
}//出栈操作
int Empty(Sqstack *S)
{
    if(S->base==S->top) return -1;
    else return 1;
}//判空操作
int GetTop(Sqstack *S)
{
    if(S->top==S->base) return -1;
    else return *(S->top-1);
}//取栈顶元素
int main()
{
    char a[51],ch;
    int i,len,flag;
    Sqstack S;
    while(gets(a)!=NULL)
    {
        flag=1;//定义指示变量
    Initstack(&S);
    len=strlen(a);
    for(i=0;i<=len-1;i++)
    {
        if(a[i]=='('||a[i]=='['||a[i]=='{') Push(&S,a[i]);//如果是左半边的括号,则压入栈中,便于之后的比较
        else if(a[i]==')')
        {
            if(Empty(&S)==-1)
            {
                flag=0;break;
            }//如果栈已为空,能不能匹配,指示变量置为0
            ch=Pop(&S);
            if(ch!='(')
            {
                flag=0;
                break;
            }//弹出栈顶指针,看括号是否匹配,若不匹配,则指示变量置为0
        }
        else if(a[i]==']')
        {
            if(Empty(&S)==-1)
            {
                flag=0;break;
            }
            ch=Pop(&S);
            if(ch!='[')
            {
                flag=0;
                break;
            }
        }//同上
        else if(a[i]=='}')
        {
            if(Empty(&S)==-1)
            {
                flag=0;break;
            }
            ch=Pop(&S);
            if(ch!='{')
                {
                    flag=0;
                    break;
                }
        }//同上
    }
    if(GetTop(&S)!=-1) flag=0;//若右括号已经没有了,但是左括号还有,说明括号不匹配,指示变量置为0
    if(flag==1) printf("yes\n");
    else printf("no\n");
    }
    return 0;
}
 

### 回答1: 答:可以使用堆栈数据结构来检查括号是否匹配。首先,遍历字符串中的每个字符,将开括号((、[、{)压入堆栈中,当遍历到闭括号时,将其与堆栈中的栈顶元素比较,如果匹配,则继续遍历,否则返回不匹配。最后,遍历完成后,检查堆栈是否为空,如果为空,则证明括号匹配,否则括号不匹配。 ### 回答2: 可以使用栈的数据结构来解决这个问题。具体的算法如下所示: 1. 创建一个空栈。 2. 遍历字符串中的每一个字符。 3. 如果当前字符是(, [, { 中的任意一个,则将其推入栈中。 4. 如果当前字符是), ], } 中的任意一个,则检查栈顶的元素: a. 如果栈为空,或者栈顶元素与当前字符不能匹配,则说明括号不匹配,返回 false。 b. 如果栈顶元素与当前字符匹配,则将栈顶元素出栈。 5. 遍历完字符串后,如果栈为空,则说明所有的括号都匹配,返回 true;否则返回 false。 以下是一个示例代码: ```python def check_matching(str): stack = [] for char in str: if char in ['(', '[', '{']: stack.append(char) elif char in [')', ']', '}']: if not stack or not is_matching(stack[-1], char): return False stack.pop() return len(stack) == 0 def is_matching(left, right): if left == '(' and right == ')': return True elif left == '[' and right == ']': return True elif left == '{' and right == '}': return True else: return False # 测试 string = input("请输入一串字符:") result = check_matching(string) if result: print("括号匹配") else: print("括号不匹配") ``` 这个算法的时间复杂度为 O(n),其中 n 是字符串的长度。算法使用了一个额外的栈空间,其空间复杂度也为 O(n)。 ### 回答3: 可以使用栈来实现括号匹配的检查。算法的思路如下: 1. 创建一个空栈。 2. 遍历给定的字符串,对于每个字符: - 如果是左括号 ( [{,将其压入栈中。 - 如果是右括号 ) ] },判断栈是否为空,如果为空,则说明右括号之前没有对应的左括号,匹配失败;如果栈不为空,则弹出栈顶元素,并判断弹出的左括号是否与当前的右括号匹配,如果不匹配,则匹配失败。 3. 遍历完字符串之后,检查栈是否为空,如果为空,则说明所有的左括号都能与右括号匹配,匹配成功;否则,匹配失败。 以下是一个示例的Python代码实现: ```python def check_matching(string): stack = [] brackets_map = {')': '(', ']': '[', '}': '{'} for char in string: if char in '([{': stack.append(char) elif char in ')]}': if not stack: return False left_bracket = stack.pop() if brackets_map[char] != left_bracket: return False return len(stack) == 0 # 测试 string = input("请输入一串字符:") if check_matching(string): print("括号匹配成功") else: print("括号匹配失败") ``` 这样,我们就可以输入一串字符,程序会返回对应的括号匹配的结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值