• 第四章 栈与队列3 (堆栈的应用)


    4.3 堆栈的应用

    4.3.1 进制转换

    十进制转成8进制:

     1 package com.datastructure.chapter04.demo;
     2 
     3 import com.datastructure.chapter04.impl.StackSLinked;
     4 import com.datastructure.chapter04.interfaces.Stack;
     5 
     6 public class ApplicationOfStack {
     7 
     8     
     9     
    10     /** 
    11      * @Title: baseConversion 
    12      * @Description:  
    13      * 10进制转成8进制:每次对十进制数求余后的结果接着求余,余数的逆序就是8进制数
    14      *  2007/8=250余7
    15      *  250/8=31余2
    16      *  31/8=3余7
    17      *  3/8=0余3
    18      * 所以8进制结果3727
    19      * @param @param i
    20      * @param @return  
    21      * @return Stack   
    22      * @throws 
    23      */
    24     public Stack baseConversion(int i){
    25         Stack s = new StackSLinked();
    26         while(i>0){
    27             s.push(i%8+"");
    28             i=i/8;
    29         }
    30         return s;
    31     }
    32     
    33     public static void main(String[] args) {
    34         
    35         ApplicationOfStack app = new ApplicationOfStack();
    36         Stack stack = app.baseConversion(2007);
    37         //输出3727
    38         while(!stack.isEmpty()){
    39             System.out.print(stack.pop());
    40         }
    41         
    42     }
    43     
    44     
    45 }
    View Code

    4.3.2 括号匹配检测

     1 package com.datastructure.chapter04.demo;
     2 
     3 import com.datastructure.chapter04.impl.StackSLinked;
     4 import com.datastructure.chapter04.interfaces.Stack;
     5 
     6 public class ApplicationOfStack {
     7 
     8     
     9     
    10     /** 
    11      * @Title: baseConversion 
    12      * @Description:  
    13      * 10进制转成8进制:每次对十进制数求余后的结果接着求余,余数的逆序就是8进制数
    14      *  2007/8=250余7
    15      *  250/8=31余2
    16      *  31/8=3余7
    17      *  3/8=0余3
    18      * 所以8进制结果3727
    19      * @param @param i
    20      * @param @return  
    21      * @return Stack   
    22      * @throws 
    23      */
    24     public Stack baseConversion(int i){
    25         Stack s = new StackSLinked();
    26         while(i>0){
    27             s.push(i%8+"");
    28             i=i/8;
    29         }
    30         return s;
    31     }
    32     
    33     /** 
    34      * @Title: bracketMatch 
    35      * @Description: 括号匹配检测 
    36      * @param @param str
    37      * @param @return  
    38      * @return boolean   
    39      * @throws 
    40      */
    41     public boolean bracketMatch(String str){
    42         StackSLinked s = new StackSLinked();
    43         
    44         for (int i = 0; i < str.length(); i++) {
    45             char c = str.charAt(i);
    46             switch(c){
    47             case '{':
    48             case '[':
    49             case '(':
    50                 s.push(Integer.valueOf(c));
    51                 break;
    52             case '}'://当遇到'}'它的时候,那么栈顶元素必然是'{'与之对应,否则就是非法的
    53                 if(!s.isEmpty() && ((Integer)s.pop()).intValue() == '{')
    54                     break;
    55                 else
    56                     return false;
    57             case ']'://当遇到']'它的时候,那么栈顶元素必然是'['与之对应,否则就是非法的
    58                 if(!s.isEmpty() && ((Integer)s.pop()).intValue() == '[')
    59                     break;
    60                 else
    61                     return false;
    62             case ')'://当遇到')'它的时候,那么栈顶元素必然是'('与之对应,否则就是非法的
    63                 if(!s.isEmpty() && ((Integer)s.pop()).intValue() == '(')
    64                     break;
    65                 else
    66                     return false;
    67             }
    68         }
    69         
    70         if(s.isEmpty()) return true;
    71         return false;
    72     }
    73     
    74     
    75     public static void main(String[] args) {
    76         
    77         ApplicationOfStack app = new ApplicationOfStack();
    78         // Stack stack = app.baseConversion(2007);
    79         // //输出3727
    80         // while(!stack.isEmpty()){
    81         // System.out.print(stack.pop());
    82         // }
    83         
    84         System.out.println(app.bracketMatch("[{()}]"));//true
    85         
    86     }
    87     
    88     
    89 }
    View Code

     4.3.3 迷宫求解

    每个单元格类Cell以及解法:

      1 package com.datastructure.chapter04.demo;
      2 
      3 import com.datastructure.chapter04.impl.StackSLinked;
      4 import com.datastructure.chapter04.interfaces.Stack;
      5 
      6 /** 
      7  * @ClassName: Cell 
      8  * @Description:每个单元格 
      9  * @author 
     10  * @date 2018年3月17日 下午10:50:56 
     11  *  
     12  */
     13 public class Cell {
     14     
     15     int x = 0;//单元所在行
     16     
     17     int y = 0;//单元所在列
     18     
     19     boolean visited = false;//是否访问过
     20     
     21     char c = ' ';//是墙('1')、可通路('0')或期待到终点的路径
     22     
     23     public Cell(){}
     24     
     25     public Cell(int x,int y,char c,boolean visited) {
     26         this.x = x; this.y = y;
     27         this.c = c; this.visited = visited;
     28     }
     29     
     30     
     31     public void mazeExit(char[][] maze,int sx,int sy,int ex,int ey){
     32         
     33         Cell[][] cells = createMaze(maze);//创建初始化迷宫;
     34         printMaze(cells);//打印迷宫
     35         
     36         Stack stack = new StackSLinked();//构造堆栈
     37         
     38         Cell startCell = cells[sx][sy];
     39         Cell endCell = cells[ex][ey];
     40         
     41         stack.push(startCell);//起点入栈
     42         
     43         startCell.visited = true;
     44         
     45         while(!stack.isEmpty()){
     46             Cell current = (Cell) stack.peek();
     47             
     48             if(current == endCell){//路径找到
     49                 while(!stack.isEmpty()){
     50                     Cell cell = (Cell) stack.pop();//沿着原路返回,将路径上的单元设置为*
     51                     cell.c = '*';
     52                     //堆栈中与cell相邻的单元才是路径的组成部分,除此之外
     53                     //堆栈中还有记录下来但是未继续向下探索的单元,
     54                     //这些单元直接出栈
     55                     while(!stack.isEmpty() && !isAdjoinCell((Cell)stack.peek(),cell))
     56                         stack.pop();
     57                     
     58                 }
     59                 System.out.println("找到从起点到终点的路劲.");
     60                 printMaze(cells);
     61                 return ;
     62             } else {//如果当前位置不是终点
     63                 int x = current.x;
     64                 int y = current.y;
     65                 int count = 0;
     66                 if(isValidWayCell(cells[x+1][y])){//向下
     67                     stack.push(cells[x+1][y]);
     68                     cells[x+1][y].visited = true;
     69                     count++;
     70                 }
     71                 
     72                 if(isValidWayCell(cells[x][y+1])){//向右
     73                     stack.push(cells[x][y+1]);
     74                     cells[x][y+1].visited = true;
     75                     count++;
     76                 }
     77                 
     78                 if(isValidWayCell(cells[x-1][y])){//向上
     79                     stack.push(cells[x-1][y]);
     80                     cells[x-1][y].visited = true;
     81                     count++;
     82                 }
     83                 
     84                 if(isValidWayCell(cells[x][y-1])){//向左
     85                     stack.push(cells[x][y-1]);
     86                     cells[x][y-1].visited = true;
     87                     count++;
     88                 }
     89                 if(count == 0) stack.pop();//如果是死点,出栈
     90             }
     91         }
     92         System.out.println("没有从起点到终点的路径");
     93     }
     94 
     95 
     96     /** 
     97      * @Title: isValidWayCell 
     98      * @Description: 判断这个单元格是不是墙,是不是已经入栈过的
     99      * @param @param cell
    100      * @param @return  
    101      * @return boolean   
    102      * @throws 
    103      */
    104     private boolean isValidWayCell(Cell cell) {
    105         return cell.c=='0' && !cell.visited;
    106     }
    107 
    108     /** 
    109      * @Title: isAdjoinCell 
    110      * @Description:  判断是否是相邻的单元格
    111      * @param @param peek
    112      * @param @param cell
    113      * @param @return  
    114      * @return boolean   
    115      * @throws 
    116      */
    117     private boolean isAdjoinCell(Cell cell1, Cell cell2) {
    118         
    119         if(cell1.x == cell2.x && Math.abs(cell1.y-cell2.y)<2) return true;
    120         if(cell1.y == cell2.y && Math.abs(cell1.x-cell2.x)<2) return true;
    121         
    122         return false;
    123     }
    124 
    125     private void printMaze(Cell[][] cells) {
    126         for (int x = 0; x < cells.length; x++) {
    127             for (int y = 0; y < cells[x].length; y++) {
    128                 System.out.print(cells[x][y].c);
    129             }
    130             System.out.println();
    131         }
    132     }
    133 
    134 
    135     private Cell[][] createMaze(char[][] maze) {
    136         
    137         Cell[][] cells = new Cell[maze.length][];
    138         for (int x = 0; x < maze.length; x++) {
    139             char[] row = maze[x];
    140             cells[x] = new Cell[row.length];
    141             for(int y=0;y<row.length;y++)
    142                 cells[x][y] = new Cell(x,y,maze[x][y],false);
    143         }
    144         return cells;
    145     }
    146     
    147     
    148     public static void main(String[] args) {
    149         Cell cell = new Cell();
    150         
    151         char[][] maze = {
    152                 {'1','1','1','1','1','1','1','1','1','1'},
    153                 {'1','0','0','1','1','1','0','0','1','1'},
    154                 {'1','0','0','1','1','0','0','1','0','1'},
    155                 {'1','0','0','0','0','0','0','1','0','1'},
    156                 {'1','0','0','0','0','1','1','0','0','1'},
    157                 {'1','0','0','1','1','0','0','1','0','1'},
    158                 {'1','0','0','0','0','1','0','1','0','1'},
    159                 {'1','0','1','1','0','0','0','1','0','1'},
    160                 {'1','1','0','0','0','0','1','0','0','1'},
    161                 {'1','1','1','1','1','1','1','1','1','1'},
    162         };
    163         cell.mazeExit(maze , 1, 7, 3, 1);
    164         
    165     }
    166 }
    View Code

    结果:

  • 相关阅读:
    day56 js收尾,jQuery前戏
    解决:No module named 'haystack.urls'
    用PicGo+Gitee(码云)搭建Markdown图床
    Python正课138 —— 基础扩展4 django
    Python正课140 —— DRF 进阶1 序列化、增删改查
    Markdown基本语法
    Python正课139 —— DRF 入门1
    用PicGo+GitHub+Typora搭建个人图床
    解决django.core.exceptions.ImproperlyConfiguredmysqlclient 1.3.13 or
    解决:Django中AttributeError:'str'objects has no attribute 'decode'
  • 原文地址:https://www.cnblogs.com/huaxueyihao/p/8593540.html
Copyright © 2020-2023  润新知