2024王道408数据结构 P92 T1

2024王道408数据结构 P92 T1

括号匹配问题

  1. 首先我们还是先看题目的意思,让我们判断表达式中的()[]{}三种括号是否合法,这题属于栈的应用,比较经典。既然是表达式那免不了其中就有其他内容,比如数字啊别的字符啊等等,所以我们要对字符串进行判断,只有当是括号时我们才把它入栈
  2. 我们先建立一个空栈s,假设字符串叫str,if (str[i] == '(' || str[i] == '[' || str[i] == '{')我们用i去遍历字符串str,只有当该字符是左括号时我们才把它入栈EnStack(s, str[i]),至于入栈的函数我们就不用多说了吧我们已经写过很多遍了。
  3. 入栈之后我们就要判断左括号是否有与其匹配的右括号,当我们遍历到一个右括号时,如果它是’)',那我们就把栈顶元素给出栈,出栈的元素放进ans里,判断这个ans是否时左括号’(',如果不是的话直接返回false,表示其表达式就是不合法的
  4. 这样凭空说可能有点抽象,我们举个例子,假设字符串str中放的内容是{[()]},当我们遍历到左括号时把它入栈,请添加图片描述
    ok当我们接下来遍历到右括号时,也就是例子中的),我们就把栈顶元素给出栈,判断它是否与)相匹配,请添加图片描述
    如果不匹配的话我们就返回false。接下来的其他括号也一样。
  5. 当我们把字符串遍历完后判断栈是否为空,如果为空的话就说明字符串中的括号都一一匹配了,他就是合法的表达式。
  6. 至于上文提到的入栈出栈操作和判断栈空栈满操作都比较基础了要自己会写

完整代码附上

//
// Created by 黎圣  on 2023/8/1.
//
#include "iostream"
//MAX是我举的例子额
#define MAX 10
struct Stack
{
    char data[MAX];
    int top;
};

//基础操作
//判断栈空
bool StackEmpty(Stack s)
{
    if (s.top == -1) return true;
    return false;
}
//判断栈满
bool StackOverflow(Stack s)
{
    if (s.top == MAX - 1) return true;
    return false;
}
//入栈
bool EnStack(Stack &s, char x)
{
    if (StackOverflow(s) == true)
    {
        printf("栈满,入栈失败\n");
        return false;
    }
    s.data[++s.top] = x;
    return true;
}
//出栈
int DeStack(Stack &s, char &x)
{
    if (StackEmpty(s) == true)
    {
        printf("栈空,出栈失败\n");
        return false;
    }
    x = s.data[s.top--];
    return 1;
}

//判断是否匹配
bool isRight(char *str)
{
    Stack s;
    s.top = -1;
    int i = 0;
    char ans;//用一个临时变量来存放出栈的元素
    while (str[i] != '\0')
    {
        if (str[i] == '(' || str[i] == '[' || str[i] == '{')
            EnStack(s, str[i]);
        else if (str[i] == ')')
        {
            DeStack(s, ans);//出栈把栈顶元素带出来判断
            if (ans != '(') return false;
        }
        else if (str[i] == ']')
        {
            DeStack(s, ans);
            if (ans != '[') return false;
        }
        else if (str[i] == '}')
        {
            DeStack(s, ans);
            if (ans != '{') return false;
        }
        i++;
    }
    if (StackEmpty(s) == true) return true;
    else return false;
}
int main()
{
    char *str = (char*)"(){}[]";
    printf("%s\n", str);
    if (isRight(str) == true)
        printf("匹配");
    else
        printf("不匹配");
    return 0;
}

感谢b站up主@吸血小金鱼感谢

王道408数据结构的应用题是指在408考试中出现的与数据结构相关的实际应用题目。在这些题目中,可能会涉及到顺序查找、折半查找、分块查找等算法王道书中给出了这些算法的代码实现,但对于考408的同学来说,掌握这些代码并不是必须的,因为408的代码题没有像自主命题那样深入和难度那么大。对于线性表的顺序表示、串以及栈和队列的实现,也不需要手写实现,可以使用标准库来解决问题。只有在题目要求你手动实现栈和队列等数据结构时,才需要进行手写实现。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [408王道数据结构强化——应用题](https://blog.csdn.net/JiangNan_1002/article/details/125828454)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [【23考研】计算机408数据结构代码题强化阶段划重点(王道书)](https://blog.csdn.net/qq_50710984/article/details/125583743)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值