>>分享数据结构和算法相关的知识和技术 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 20776 个阅读者 刷新本主题
 * 贴子主题:  Java数据结构与算法 - 栈和队列 回复文章 点赞(0)  收藏  
作者:flybird    发表时间:2020-02-06 17:37:51     消息  查看  搜索  好友  邮件  复制  引用

          
                              
      Java的数据结构主要涉及三种数据存储类型:栈,队列,优先级队列。这些数据存储类型的生命周期比数组等数据结构要短得多,在程序执行期间才被创建。栈的主要机制可以用数组来实现;队列,优先级队列可以使用数组或者一种特别的树 - 堆来实现。通过对数组进行封装,使得他们面向的问题更加专业。

      1)在这些数据结构中,只有一个数据项可以被访问。

      2)栈的操作是在栈顶压入一个数据项,以及从栈顶移除一个数据项。

      3)队列的操作是在队尾压入数据,在队头取出数据。

      4)优先级队列的操作是有序的插入数据,从队头取出关键字最小、最大的数据。

         1. 栈

       1.1. 栈的实现

       栈只允许访问一个数据项,即最后插入的数据项。移除这个数据项才能访问第二个数据项。一般来说将数组经过一定包装,使之满足压栈,弹栈的性质就能实现栈的基本能力。栈通常包含三个数据成员,两个基本方法:一个数组,一个最大栈空间,一个top指针;压栈,弹栈(读取栈顶元素)。                    
  1.        /**
  2.        *  @file 简单地说, 栈就是将数组进行封装来更方便的实现一些功能
  3.        *  @author zkj
  4.        *  @date 2017-07-27
  5.        */
  6.        class  Stack {
  7.      // 数据成员
  8.      private  int maxSize;
  9.      private  int[] stackArray;
  10.      private  int top;
  11.      // 构造函数
  12.        public  Stack ( int size) {
  13.      maxSize = size;
  14.      stackArray =  new  int[maxSize];
  15.      top = - 1;
  16.      }
  17.      // 压栈
  18.        public  void  push ( int element) {
  19.      if (!isFull())
  20.      stackArray[++top] = element;
  21.      }
  22.      // 弹栈
  23.        public  int  pop () {
  24.      return stackArray[top--];
  25.      }
  26.      }

   1.2 栈的应用

      栈的主要应用:文本匹配,比如检测源程序中括号匹配问题;算术表达式解析,比如3 * (4 + 5);大部分微处理器基于栈的体系结构,在函数被调用时压栈,弹栈。

       1.2.1 文本括号匹配

       对于一串文本,检查括号是否匹配,比如abc{defg[hijklm(nopq)rstu]v}wxyz,检测括号是否配对。解决办法:遍历字符串,将{, [, ( 依次入栈(普通字符不入栈),当遍历到), ] }时,弹栈,进行比较,看两者是否匹配。                        

  1.       // 栈类:实现栈操作
  2.        class  StackChar {
  3.      // 数据成员
  4.      private  int maxSize;
  5.      private  char[] stackArray;
  6.      private  int top;
  7.      // 构造函数
  8.        public  StackChar ( int size) {
  9.      maxSize = size;
  10.      stackArray =  new  char[maxSize];
  11.      top = - 1;
  12.      }
  13.      // 压栈
  14.        public  void  push ( char element) {
  15.      if (!isFull())
  16.      stackArray[++top] = element;
  17.      }
  18.      // 弹栈
  19.        public  char  pop () {
  20.      return stackArray[top--];
  21.      }
  22.      // 栈满?
  23.        public  boolean  isFull () {
  24.      if (top == maxSize)
  25.      return  true;
  26.      else
  27.      return  false;
  28.      }
  29.      // 栈空?
  30.        public  boolean  isEmpty () {
  31.      if (top <  0)
  32.      return  true;
  33.      else
  34.      return  false;
  35.      }
  36.      }

  1.       // 检查是否匹配
  2.        class  BracketChecker {
  3.      private String input;
  4.        public  BracketChecker (String in) {
  5.      input = in;
  6.      }
  7.        public  void  check () {
  8.      int stackSzie = input.length();
  9.      StackChar theStack =  new StackChar(stackSzie);
  10.      for ( int i =  0; i < stackSzie; i++) {
  11.      char ch = input.charAt(i);
  12.      switch (ch) {
  13.      case  '{':
  14.      case  '[':
  15.      case  '(':
  16.      theStack.push(ch);
  17.      break;
  18.      case  '}':
  19.      case  '>':
  20.      case  ')':
  21.      if (!theStack.isEmpty()) {
  22.      char chx = theStack.pop();
  23.      if ((chx ==  '{' && ch !=  '}') || (chx ==  '[' && ch !=  ']') || (chx ==  '(' && ch !=  ')')) {
  24.      System.out.println( "Error: " + ch +  " at " + i);
  25.      }
  26.      }
  27.      else
  28.      System.out.println( "Error: " + ch +  " at " + i);
  29.      default:
  30.      break;
  31.      }
  32.      }
  33.      if (!theStack.isEmpty()) {
  34.      System.out.println( "Error: missing right delimiter.");
  35.      }
  36.      }
  37.      }

         2. 队列

      栈的特性是:先进后出;队列则是:先进先出。比如打印机打印东西的顺序,银行叫号排队系统等等。队列六个基本元素:存储数据的数组,头指针,尾指针,队列最大尺寸,数据进队列,数据出队列。

       2.1 队列的实现                  

  1.       // 队列类
  2.        class  Queue {
  3.      // 数据成员
  4.      private  int[] arr;
  5.      private  int head;
  6.      private  int tail;
  7.      private  int maxSize;
  8.      // 构造函数
  9.        public  Queue ( int size) {
  10.      maxSize = size;
  11.      head = - 1;
  12.      tail = - 1;
  13.      }
  14.      // 压入队列
  15.        public  void  push ( int element) {
  16.      if (tail <= maxSize){
  17.      arr[++tail] = element;
  18.      }
  19.      }
  20.      // 移除队列
  21.        public  int  pop () {
  22.      return arr[++head];
  23.      }
  24.      }

         3. 优先级队列

      优先级队列是指队列中的元素按照某种顺序进行排列,比如数值型数据的大小顺序,字符型数据字典序等等。有序插入,队头取出。

                                                                                                                          
----------------------------
原文链接:https://blog.csdn.net/ZK_J1994/article/details/76184916

程序猿的技术大观园:www.javathinker.net





[这个贴子最后由 flybird 在 2020-02-06 21:08:27 重新编辑]
  Java面向对象编程-->输入与输出(下)
  JavaWeb开发-->JSP技术详解(Ⅱ)
  JSP与Hibernate开发-->数据库事务的概念和声明
  Java网络编程-->非阻塞通信
  精通Spring-->组合(Composition)API
  Vue3开发-->Vue指令
  Codility 算法测验
  算法学习与收集:一些有用的算法网站和网页
  常见的调度算法
  算法的概念、特征和基本类型简介
  进程调度算法总结
  分布式一致Hash算法-存储之道
  Java 选择排序算法
  如何面对“算法”的困惑?
  用Java写算法:快速排序
  对称算法非对称算法哈希算法区别
  Citrix Netscaler负载均衡算法
  令牌桶算法
  活动安排问题(贪心算法)
  用Java实现回文数算法
  好书推荐:《小灰的算法之旅》
  更多...
 IPIP: 已设置保密
楼主      
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。