栈和队列的基本应用

本文详细介绍了栈和队列在算法中的基本应用,包括括号匹配的栈应用,表达式转换求值(中缀转后缀、前缀表达式及其求值)以及栈在递归中的应用。此外,还讲解了队列在树的层次遍历、图的广度优先遍历和操作系统中的应用。
摘要由CSDN通过智能技术生成

目录

1 栈的基本应用

1.1 括号匹配

1.2 表达式转换求值

1.2.1 表达式转换(中缀转后缀、前缀)

1.2.2 表达式求值(后缀、前缀的手算和机算)

1.3 栈在递归中的应用

2 队列的基本应用

2.1 树的层次遍历

2.2 图的广度优先遍历

2.3 队列在操作系统中的应用


1 栈的基本应用

1.1 括号匹配

问题:

假设表达式有三种括号:圆括号“()”,花括号“{}”,方括号“[]”。它们可互相嵌套,如{([])}或{([])()[]}均为正确格式。而{)),{[()]均为不正确格式。

输入由三种括号构成的字符串,如何检测字符串里括号格式的正确性?

力扣题目:有效的括号

算法思路:

  • 创建一个空栈,开始顺序扫描所有字符
  • 遇到左括号入栈
  • 遇到右括号则弹出已入栈的栈顶左括号(若栈为空没有左括号,直接退出报错)
  • 检查两括号是否匹配(若两括号类型不一样,直接退出报错)
  • 若所有字符都扫描完,检查栈里是否还剩余左括号(若栈里还有左括号剩余,则报错)

算法核心就是:遇到左括号就入栈,遇到右括号就弹出栈顶的左括号与右括号匹配

匹配失败有三种情况:

  • 右括号单身(右括号要匹配时,栈已经为空)
  • 左右括号不匹配
  • 左括号单身(右括号匹配完,栈不为空)

 实现代码:

bool isValid(char * s)
{
    int len=strlen(s);
    char stack[len];
    int top=-1;    //栈顶指针
    for(int i=0;i<len;i++)
    {
        if((s[i]=='(')||(s[i]=='[')||(s[i]=='{'))
           stack[++top]=s[i];
        else
        {
            if(top==-1)
                return false;
            else
            {
                if((s[i]==')'&&stack[top]=='(')||(s[i]==']'&&stack[top]=='[')||(s[i]=='}'&&stack[top]=='{'))
                    top--;
                else
                    return false;
            }
        }
    }
    if(top!=-1)
        return false;
    else
        return true;
}

1.2 表达式转换求值

1.2.1 表达式转换(中缀转后缀、前缀)

中缀表达式:(我们正常手写的表达式)

左操作数  运算符  右操作数 」(运算符 是写在 两个操作数 中间的)

 如表达式:A + B * (C - D) E / F

后缀表达式:

左操作数

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值