`
tify
  • 浏览: 14537 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

栈于队列

 
阅读更多

一:栈

1.栈的应用背景

栈是一种线性数据结构,并且只能在某一端存数据和取数据。

关键词:先进先出。

2.栈的两种实现方法:

2.1用ArrayList实现栈

具体代码如下:

  1. importjava.util.ArrayList;
  2. publicclassArrayListAsStack{
  3. ArrayListstack=newArrayList();
  4. publicArrayListAsStack(intn){
  5. stack.ensureCapacity(n);
  6. }
  7. publicvoidpush(Objecto1){
  8. stack.add(o1);
  9. }
  10. publicObjectpop(){
  11. returnstack.remove(stack.size()-1);
  12. }
  13. publicObjecttopEle(){
  14. returnstack.get(stack.size()-1);
  15. }
  16. publicbooleanisEmpty(){
  17. returnstack.isEmpty();
  18. }
  19. publicvoidclean(){
  20. stack.clear();
  21. }
  22. }

Pop:只用删除ArrayList中的最后一个元素

Push:在ArrayList中添加一个元素

2.2用LinkedList实现栈

代码如下:

  1. importjava.util.LinkedList;
  2. publicclassLinkedListAsStack{
  3. LinkedListstack=newLinkedList();
  4. publicvoidpush(Objecto1){
  5. stack.add(o1);
  6. }
  7. publicObjectpop(){
  8. returnstack.removeLast();
  9. }
  10. publicObjecttopEle(){
  11. returnstack.getLast();
  12. }
  13. publicbooleanisEmpty(){
  14. returnstack.isEmpty();
  15. }
  16. publicvoidclean(){
  17. stack.clear();
  18. }
  19. }

Pop:删除链表中最后一个节点

Push:在链表中添加一个节点

二:队列

队列与栈的不同之处在于,队列的两端都有用到,数据从队列的尾部添加,从队列的头部取出。FIFO原则。

1.队列的实现

与栈相同,队列可以通过array和linkedlist两种方式实现,在此不再累述。

2.优先队列

队列的先进先出有时候会有一定的局限性。例如:银行办业务的客户必须按照“先进先出”的性质进行等待办理,但是有的客户持有的是金卡,则应该被有限办理。优先队列则用于处理这类的问题。

即优先队:数据的存入是按照先进先出的方式放进去的,但是存入的数据有对应的优先级,则取出的时候根据优先级取出。

三:用栈实现走迷宫

老鼠走迷宫是栈的一个典型应用,如下,有一个简单的迷宫(m代表入口,e代表出口,0代表该路行得通,1代表墙):

1 1 0 0

0 0 0 e

0 0 m 1

思想:老鼠会尝试所有可行的路径(上、下、左、右四个方向),如果碰到了死角,则会返回到最后一步再尝试其他路径,所以上下左右方向的顺序会影响到最后寻找的出路。

实现:

我们将迷宫放在一个二维数组里,由于数组的计数从0开始,我们为了更直观,在初始二维数组周围加上2,如下

1 1 1 1 1 1

1 1 1 0 0 1

1 0 0 0 e 1

1 0 0 m 1 1

1 1 1 1 1 1

这里需要用到栈,将可能走的位置按照一定的规律压入栈中(例如上下左右),例如到了A的位置,则在A的基础上往下走,如果A后面没有可行的路径,则返回至A的上一步。下面详解实现。

(1)构建MazeCell:表示迷宫的位置

  1. publicclassMazeCell{
  2. intx;
  3. inty;
  4. publicMazeCell(){
  5. }
  6. publicMazeCell(inta,intb){
  7. this.x=a;
  8. this.y=b;
  9. }
  10. publicBooleanequals(MazeCellcell){
  11. if(cell.x==this.x&&cell.y==this.y)
  12. returntrue;
  13. else
  14. returnfalse;
  15. }
  16. }

(2)寻找出路的具体实现

  1. publicclassMaze{
  2. //构建maze所需的参数
  3. char[][]maze=newchar[5][6];
  4. charentrance='m';
  5. charexit='e';
  6. charpass='0';
  7. charnotPass='1';
  8. charvisited='2';
  9. //获得maze路径所需参数
  10. Stack<MazeCell>pushUnvisited=newStack<MazeCell>();
  11. MazeCellcurrentCell=newMazeCell();
  12. MazeCellexitCell=newMazeCell(2,4);
  13. MazeCellentryCell=newMazeCell(3,3);
  14. publicstaticvoidmain(String[]args){
  15. Mazemaze=newMaze();
  16. maze.makeMaze();
  17. maze.getPath();
  18. }
  19. //构造一个maze
  20. publicvoidmakeMaze(){
  21. //给迷宫外加上1
  22. for(inti=0;i<6;i++){
  23. maze[0][i]=notPass;
  24. maze[4][i]=notPass;
  25. }
  26. for(intj=0;j<5;j++){
  27. maze[j][0]=notPass;
  28. maze[j][5]=notPass;
  29. }
  30. maze[1][1]=notPass;
  31. maze[1][2]=notPass;
  32. maze[1][3]=pass;
  33. maze[1][4]=pass;
  34. maze[2][1]=pass;
  35. maze[2][2]=pass;
  36. maze[2][3]=pass;
  37. maze[2][4]=exit;
  38. maze[3][1]=pass;
  39. maze[3][2]=pass;
  40. maze[3][3]=entrance;
  41. maze[3][4]=notPass;
  42. }
  43. //寻找走出迷宫的路径
  44. publicvoidgetPath(){
  45. currentCell=entryCell;
  46. while(!currentCell.equals(exitCell)){
  47. intx=currentCell.x;
  48. inty=currentCell.y;
  49. //搜索路径为上下左右,不同的顺序会有不同结果
  50. pushStack(x-1,y);
  51. pushStack(x+1,y);
  52. pushStack(x,y-1);
  53. pushStack(x,y+1);
  54. //把走过的位置标记成visited
  55. if(!currentCell.equals(entryCell)){
  56. maze[x][y]=visited;
  57. }
  58. //如果在还没到达终点,栈就空了,说明该迷宫米有出路
  59. if(pushUnvisited.isEmpty()){
  60. System.out.println("failure");
  61. return;
  62. }
  63. //将当前位置往前移
  64. MazeCelltmp=pushUnvisited.pop();
  65. currentCell=tmp;
  66. //输出我走过的节点
  67. System.out.println(tmp.x+","+tmp.y);
  68. }
  69. }
  70. publicvoidpushStack(intx,inty){
  71. //如果是visited或notPass,则不能压进栈
  72. if(maze[x][y]==pass||maze[x][y]==exit){
  73. pushUnvisited.push(newMazeCell(x,y));
  74. }
  75. }
  76. }
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics