美文网首页
队列和栈的应用

队列和栈的应用

作者: 别时茫茫 | 来源:发表于2018-03-15 22:29 被阅读0次

队列和栈的使用

标签(空格分隔): algorithm


队列和栈的应用

1.队列的应用

  • 队列是一种常见的数据结构,主要的特性先进来的元素会先出去,也就是First In First Out:FIFO ,所以适合具有这个特性的算法来使用,比如图的广度优先搜索二叉树的层次遍历等。
  • 所以队列和生活中的排队非常相似,先来的先服务,后来的后服务。

2.栈的应用

  • 栈和队列的特性不一样,队列的特性是先进先出先进后出
  • 栈的出口和入口只有一个,都是从一个地方进入或者出去,所以进去的时候,就不能出来,而且出来的时候,只有最后进入的能够出来
  • 比较适合于先进来等着,等到满足某种条件的时候,才按照后来的先处理
  • 想起了进电梯的场景,一般都是先进电梯的最后出来(考虑到同一楼层的)

5.栈使用举例

  • 这里有个题目说的是如何判断一个括号字符串包含的括号对:'{','}','[',']','(',')' 是否合理
  • 假设有个字符串"{}{}(){}[]{][",其实括号的匹配是有一定的规律的,']',')','}' 只要出现右括号的地方,那么它前面必须要有一个其对应的左括号才行,如果不是对应的左括号,那么就是不合理的括号串。类似消消乐,只是条件是最近的括号匹配可以消除
  • 具体的就是,再扫描字符串的过程中,首先把左括号存起来,遇到右括号的时候,看看离这个右括号最近的左括号(栈顶的左括号)是否合理,把合理的括号对匹配上,不合理的直接返回整个括号字符串不合理。
  • 最后如果是完全匹配,那么栈为空,只要栈非空,那么说明不是完全匹配
  • 从上面的描述中能看出来,后扫描到的左括号要存起来,但是有需要在遇到右括号的时候,匹配最近的左括号,有后进先出的特性吧,这就是一个很典型的栈的应用。
public boolean isValid(String s) {
        Stack<Character> stack = new Stack<Character>();
        for(int i= 0; i < s.length(); ++i){
            char c = s.charAt(i);
            if (c == '(' || c == '{' || c == '[') { // 左括号放入栈中,等待匹配
                stack.push(c);
            }else { // 右括号,进行匹配 
                /**1.栈为空,无法匹配false
                 * 2.匹配上则把左括号匹配出栈
                 * 3.没有匹配上那么false
                 * */
                if(stack.empty()) 
                    return false;
                char ch = stack.peek();
                if(c - ch == '}' - '{' || c - ch == ']' - '[' || c - ch == ')' - '(')
                    stack.pop();//把匹配的左括号出栈
                else
                    return false;
            }
        }
        /**如果栈为空,那么完全匹配*/
        return stack.empty();
    }


  • 值得提的是,栈的应用非常广泛,例如:函数调用函数调用,从CPU角度来看,CPU首先会保存调用者A的现场内容(变量等情况),这个时候会把这个现场情景进栈(也就是数据信息),保存在栈中。然后去执行A调用的函数B,如果这个时候B还调用了函数C,那么在CPU转去执行C的时候,还是会类似的把B的现场进栈,一直到C函数执行完,再从栈中把B现场出栈,继续执行B,然后B执行完,把A的现场出栈,执行A,直到所有的程序执行结束。
/**main ->
 *      A -> 
 *              B ->
 *                  C 执行完
 *                  <-C
 *              <- B
 *      A <-  
 * 执行A ->调用 B ->调用C   c返回->执行B  B返回->执行A
 * |    |   |    |  |    |      |    |      |    |
 * |    |   |    |  |    |      |    |      |    |
 * |    |   |    |  | B  |      |    |      |    |
 * |    |   | A  |  | A  |      | A  |      |    |
 * |main|   |main|  |main|      |main|      |main|
 * 
 * 
 * **/


  • 从上面的调用可以看出来,函数的调用也是有成本的,如果函数嵌套调用的越多所消耗的资源,栈数据也就越大
  • 如果上面的函数B,C都是A函数的话,那么就会出现A调用自己的情况,这就是函数的递归调用
  • 所以函数的递归是通过栈这种数据结构来实现的,后面大多数的递归,都能通过使用栈的方式来实现。

相关文章

  • 算法-栈和队列算法总结

    栈和队列算法总结 1 模拟 1.1 使用栈实现队列 1.2 使用队列实现栈 2 栈的应用 2.1 栈操作 2.2 ...

  • 队列和栈的应用

    队列和栈的使用 标签(空格分隔): algorithm 队列和栈的应用 1.队列的应用 队列是一种常见的数据结构,...

  • 栈和队列—栈的应用

    冰冻非一日之寒 这里介绍栈的三种应用~ 编辑器—Ctrl+Z(撤销) 当我们在文档中打这样一句话“我爱数据结构” ...

  • 栈&队列

    一、栈&队列总结 栈/队列的应用接雨水验证栈序列滑动窗口的最大值 栈/队列的特殊实现用两个栈实现队列用两个队列实现...

  • 队列

    队列特性 对比队列和栈 基于数组的队列 对比队列学习循环队列 循环队列难点 阻塞队列 并发队列 应用:线程池中拒绝...

  • 数据结构——栈和队列

    用数组实现栈和队列 用栈实现队列 用队列实现栈 栈和队列的经典算法题最小间距栈宠物收养所 数组实现栈和队列 用数组...

  • 栈和队列

    用栈定义队列(出入栈) 用队列定义栈(数据队列和辅助队列)

  • Ⅱ. 栈和队列

    栈和队列都是线性结构,可以用线性表在某种条件下来完成栈和队列的操作 1. 栈 : 先进后出的线性表 应用 : 常见...

  • Algorithm小白入门 -- 队列和栈

    队列和栈队列实现栈、栈实现队列单调栈单调队列运用栈去重 1. 队列实现栈、栈实现队列 队列是一种先进先出的数据结构...

  • 数据结构学习 | 队列和栈

    栈 后进先出 栈顶允许插入(压栈)、删除(弹栈) 应用:数制转换数制转换与栈 队列 先进先出 队列头部允许删除,队...

网友评论

      本文标题:队列和栈的应用

      本文链接:https://www.haomeiwen.com/subject/jqpkqftx.html