Java数据结构与算法之栈(动力节点Java学院整理)

 更新时间:2017年04月12日 11:40:26   投稿:mrr  
这篇文章主要介绍了Java数据结构与算法之栈,栈是先进后出的数据的结构,本文通过文字说明与实例代码相结合的形式给大家介绍的非常详细,需要的朋友跟着小编一起学习吧

stack,中文翻译为堆栈,其实指的是栈,heap,堆。这里讲的是数据结构的栈,不是内存分配里面的堆和栈。

栈是先进后出的数据的结构,好比你碟子一个一个堆起来,最后放的那个是堆在最上面的。

队列就是排队买苹果,先去的那个可以先买。


public class Stack { 
   private int array[]; 
   private int max; 
   private int top; 
   public Stack(int max){ 
     this.max = max; 
     array = new int[max]; 
     top = 0; 
   } 
   public void push(int value){ 
     if(isFull()){ 
       System.out.println("full,can not insert"); 
       return; 
     } 
     array[top++]=value; 
   } 
   public int pop(){ 
     return array[--top]; 
   } 
   public boolean isEmpty(){ 
     if(top == 0){ 
       return true; 
     } 
     return false; 
   } 
   public boolean isFull(){ 
     if(top == max ){ 
       return true; 
     } 
     return false; 
   } 
   public void display(){ 
     while(!isEmpty()){ 
       System.out.println(pop()); 
     } 
   } 
   public static void main(String[] args) { 
     Stack s = new Stack(5); 
     s.push(1); 
     s.push(3); 
     s.push(5); 
     s.push(5); 
     s.push(5); 
     s.display(); 
   } 
 } 

其实还是觉得设置top为-1好计算一点,记住这里的i++和++i,如果i=1,那么array[i++]=2,指的是array[1]=2,下次用到i的时候i的值才会变2,而++i就是直接使用i=2。

top指向0,因为每次都push一个元素加一,那么添加到最后一个元素的时候top=max。由于先进后出,那么先出的是最后进的,刚刚为top-1所在的位置。

正确输出:

 5 
 5 
 5 
 3 
 1 

一、栈的使用——单词逆序。

 public String reverse(String in){ 
     String out=""; 
     for (int i = 0; i < in.length(); i++) { 
       char c = in.charAt(i); 
       push(c); 
     } 
     while(!isEmpty()){ 
       out+=pop(); 
     } 
     return out; 
   } 
   public static void main(String[] args) { 
     Scanner s = new Scanner(System.in); 
     String string = s.nextLine(); 
     Stack st = new Stack(string.length()); 
     System.out.println(st.reverse(string));      
   } 

将Stack的数组类型改为char即可。

读取输入也可以用IO读取。

 public static void main(String[] args) { 
   InputStreamReader is = new InputStreamReader(System.in); 
   BufferedReader b = new BufferedReader(is); 
   String string=""; 
   try { 
     string = b.readLine(); 
   } catch (IOException e) { 
     e.printStackTrace(); 
   } 
   Stack st = new Stack(string.length()); 
   System.out.println(st.reverse(string)); 
 } 

二、栈的使用——分隔符匹配。

 public int charat(char c){ 
   for (int i = 0; i < array.length; i++) { 
     if(c == array[i]) 
       return i; 
   } 
   return array.length; 
 } 
 public void match(String in){ 
   String out=""; 
   for (int i = 0; i < in.length(); i++) { 
     char c = in.charAt(i); 
     if(c == '{' || c == '(' || c == '[' ){ 
       push(c); 
     } 
     if(c == '}' || c == ')' || c == ']'){ 
       char temp = pop(); 
      if(c == '}' && temp != '{'|| c == ')' && temp != '('|| c == ']' && temp != ']'){ 
         System.out.println("can not match in "+i); 
       } 
     } 
   } 
   while(!isEmpty()){ 
     char c = pop(); 
     if(c == '{'){ 
       System.out.println("insert } to match "+charat(c)); 
     } 
     if(c == '[' ){ 
       System.out.println("insert ] to match "+charat(c)); 
     } 
     if(c == '(' ){ 
       System.out.println("insert ) to match "+charat(c)); 
     } 
   } 
 } 
 public static void main(String[] args) { 
   Scanner s = new Scanner(System.in); 
   String string = s.nextLine(); 
   Stack st = new Stack(string.length()); 
   st.match(string); 
 } 
 result: 
 klsjdf(klj{lkjjsdf{) 
 can not match in 19 
 insert } to match 1 
 insert ) to match 0 

将({[先压入栈,一旦遇到)}]便与弹出的元素比较,若吻合,则匹配。如果一直没有)}],最后便会弹出栈的左符号,提示是在具体哪个位置,缺少的具体的右符号类型。

这是可以用栈来实现的工具。

栈中数据入栈和出栈的时间复杂度为常数O(1),因为与数据个数无关,直接压入弹出,操作时间短,优势便在这里,如果现实生活的使用只需用到先进后出的顺序而且只用到进出数据的比较,那就可以使用栈了。

以上所述是小编给大家介绍的Java数据结构与算法之栈(动力节点Java学院整理),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • Java中关于子类覆盖父类的抛出异常问题

    Java中关于子类覆盖父类的抛出异常问题

    今天小编就为大家分享一篇关于Java中关于子类覆盖父类的抛出异常问题,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-04-04
  • IDEA 自带的数据库工具真的很牛(收藏版)

    IDEA 自带的数据库工具真的很牛(收藏版)

    这篇文章主要介绍了IDEA 自带的数据库工具真的很牛(收藏版),本文以 IntelliJ IDEA/ Mac 版本作为演示,其他版本的应该也差距不大,需要的朋友可以参考下
    2021-04-04
  • Maven修改运行环境配置代码实例

    Maven修改运行环境配置代码实例

    这篇文章主要介绍了Maven修改运行环境配置代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • SpringBoot项目删除Bean或者不加载Bean的问题解决

    SpringBoot项目删除Bean或者不加载Bean的问题解决

    文章介绍了在Spring Boot项目中如何使用@ComponentScan注解和自定义过滤器实现不加载某些Bean的方法,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧
    2025-01-01
  • Java中的继承详情

    Java中的继承详情

    这篇文章主要介绍了Java中的继承详情,继承是面向对象三大特征之一,可以使得子类具有父类的属性和方法,还可以在子类中重新定义,以及追加属性和方法,下文介绍需要的朋友可以参考下
    2022-04-04
  • 详解Java中使用ImageIO类对图片进行压缩的方法

    详解Java中使用ImageIO类对图片进行压缩的方法

    这篇文章主要介绍了Java中使用ImageIO类对图片进行压缩的方法,能够按指定的比例调整图片的宽高,需要的朋友可以参考下
    2016-04-04
  • java数据结构图论霍夫曼树及其编码示例详解

    java数据结构图论霍夫曼树及其编码示例详解

    这篇文章主要为大家介绍了java数据结构图论霍夫曼树及其编码示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2021-11-11
  • 详解Java的Spring框架中的注解的用法

    详解Java的Spring框架中的注解的用法

    这篇文章主要介绍了Java的Spring框架中的注解的用法,包括对Java bean的定义的作用介绍,需要的朋友可以参考下
    2015-11-11
  • Java常用面板之JScrollPane滚动面板实例详解

    Java常用面板之JScrollPane滚动面板实例详解

    这篇文章主要介绍了Java常用面板JScrollPane的简单介绍和一个相关实例,,需要的朋友可以参考下。
    2017-08-08
  • java阿拉伯数字转中文数字

    java阿拉伯数字转中文数字

    这篇文章主要为大家详细介绍了java实现阿拉伯数字转换为中文数字,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-04-04

最新评论