算法和数据结构(4)栈和队列的运用

栈的应用

由于栈具有“后进先出”的固有特性;

  1. 括号匹配问题;
    如leetcode上一题:检验括号的正确性:

    (){}->true

    []]->false

    [(])->false

    [()]->true

java代码如下

class Solution {
    public boolean isValid(String s) {
        char[] chars = s.toCharArray();
        ArrayList<Character> data = new ArrayList<>();
        for(int j = chars.length-1;j>=0;j--){
            if(chars[j]==41||chars[j]==93||chars[j]==125){
                data.add(chars[j]);
            }else if(chars[j]==40||chars[j]==91||chars[j]==123){
                try{
                    char c = data.get(data.size()-1);
                    if(c==41){
                        if(c==chars[j]+1){
                            data.remove(data.size()-1);
                            continue;
                        }
                    }else{
                        if(c==chars[j]+2){
                            data.remove(data.size()-1);
                            continue;
                        }
                    }
                return false;
                }catch(Exception e){
                    return false;
                }
            }else return false;
        }
        if(data.size()==0) return true;
        return false;
    }
}
  1. 栈和递归调用的实现

    递归:一个函数(方法)直接或间接的调用自己本身;

    为了使递归不是死循环,故有效的递归含终止条件;

    联系java虚拟机中的栈,堆,方法区的内存结构,可理解压栈,弹栈,栈溢出等名词;

队列的应用

  1. 队列在层次遍历中的应用

    逐层或逐行处理,这列问题的解决方法往往是在处理当前层或当前行就对下一层或者下一行做预处理,把处理的顺序安排好,待当前层或当前行处理完毕,就可以处理下一层或下一行。使用队列为了保存下一步的处理顺序

    如广度优先搜索(BFS):

    给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。

    输入:
    11110
    11010
    11000
    00000
    
    输出: 1
    
    输入:
    11000
    11000
    00100
    00011
    
    输出: 3
    
    class Solution {
      public int numIslands(char[][] grid) {
        if (grid == null || grid.length == 0) {
          return 0;
        }
    
        int nr = grid.length;
        int nc = grid[0].length;
        int num_islands = 0;
    
        for (int r = 0; r < nr; ++r) {
          for (int c = 0; c < nc; ++c) {
            if (grid[r][c] == '1') {
              ++num_islands;
              grid[r][c] = '0'; // mark as visited
              Queue<Integer> link = new LinkedList<>();
              link.add(r * nc + c);
              while (!link.isEmpty()) {
                int id = link.remove();
                int row = id / nc;
                int col = id % nc;
                if (row - 1 >= 0 && grid[row-1][col] == '1') {
                  link.add((row-1) * nc + col);
                  grid[row-1][col] = '0';
                }
                if (row + 1 < nr && grid[row+1][col] == '1') {
                  link.add((row+1) * nc + col);
                  grid[row+1][col] = '0';
                }
                if (col - 1 >= 0 && grid[row][col-1] == '1') {
                  link.add(row * nc + col-1);
                  grid[row][col-1] = '0';
                }
                if (col + 1 < nc && grid[row][col+1] == '1') {
                  link.add(row * nc + col+1);
                  grid[row][col+1] = '0';
                }
              }
            }
          }
        }
    
        return num_islands;
      }
    }
    
  2. 队列在计算及工程中的应用

    1. 解决主机与外部设别之间速度不匹配的问题

      如:主机与打印机速度不匹配,-》缓冲区,写入缓冲区,提前准备数据;

    2. 解决多用户引发的资源竞争问题;

      cpu资源竞争,多个用户需要cpu各自运行自己的程序,分别提出占用cpu的请求,操作系统通常按照每个请求在时间上的先后顺序,排成一个队列,相应的程序运行结束或用完规定的时间间隔后,则令其出列;

发布了17 篇原创文章 · 获赞 0 · 访问量 370

猜你喜欢

转载自blog.csdn.net/qq_32193775/article/details/104025180