用Java代码实现栈数据结构的基本方法归纳_java

链式实现:

在栈的一段添加和删除元素,在栈中维护一个指向栈顶的结点和一个count变量指示栈的大小:
private LinearNode top; //指向栈顶
private int count;//标记栈的大小
每次出栈和压栈在链表的表头:(也可以再表尾,实现方式不一样而已)
top--->元素1--->元素2--->元素3.........
实现(附带测试main):
LinkedStack

package Stack;
import Bag.LinearNode;
//为了重点来实现算法,将异常情况直接打印出然后退出程序,不再声明异常类
public class LinkedStack implements StackADT {
  private LinearNode top; //指向栈顶
  private int count;//标记栈的大小
  public static void main(String[] args){
    LinkedStack stack = new LinkedStack();
    System.out.println("将0到10依次压栈");
    for(int i = 0;i < 10;i++)
      stack.push(i);
    System.out.println("连续执行5次出栈操作");
    for(int i = 0;i < 5;i++)
      stack.pop();
    System.out.println("栈为空吗?: " + stack.isEmpty());
    System.out.println("栈的大小为: " + stack.size());
    System.out.println("栈顶元素为: " + stack.top.getElement());
    System.out.println("栈顶元素为: " + stack.peek());
  }
  public LinkedStack()
  {
    top = null;
    count = 0;
  }
  public int size() {
    return count;
  }
  public boolean isEmpty() {
    return (size() == 0);
  }
  public void push(Object element) {
    LinearNode node = new LinearNode(element);
    node.setNext(top);
    top = node;
    count++;
  }
  public Object pop() {
    if(isEmpty())
    {
      System.out.println("stack is empty!");
      System.exit(1);
    }
    Object result = top.getElement();
    top = top.getNext();
    count--;
    return result;
  }
  public Object peek() {
    Object result = top.getElement();
    return result;
  }
}

运行结果:
将0到10依次压栈
连续执行5次出栈操作
栈为空吗?: false
栈的大小为: 5
栈顶元素为: 4
栈顶元素为: 4

数组实现:

栈底总是数组下标为0的位置,入栈出栈从数组下标的最后一个元素开始:

private Object[] contents;
private int top;//top标记下一个入栈的位置,同时也表示栈的容量大小,跟链式实现的count比较一下!!!

实现(附带测试main):
ArrayStack

package Stack;
public class ArrayStack implements StackADT {
  private Object[] contents;
  private int top;//top标记下一个入栈的位置,同时也表示栈的容量大小,跟链式实现的count比较一下!!!
  private static int SIZE = 10;
  public ArrayStack()
  {
    contents = new Object[SIZE];
    top = 0;
  }
  public void expand(){//借助于申请一个辅助空间,每次扩展容量一倍
    Object[] larger = new Object[size()*2];
    for(int index = 0;index < top;index++)
      larger[index] = contents[index];
    contents = larger;
  }
  public int size() {
    return top;
  }
  public boolean isEmpty() {
    return (size() == 0);
  }
  public void push(Object element) {
    //if(isEmpty())
      //expand();
    if(top == contents.length)
      expand();
    contents[top] = element;
    top++;
  }
  public Object pop() {
    if(isEmpty())
    {
      System.out.println("stack is empty!");
      System.exit(1);
    }
    Object result = contents[top-1];
    contents[top-1] = null;//出栈
    top--;
    return result;
    /*书上这样写简便一点:::
     * top--;
     * Object result = contents[top];
     * contents[top] = null;*/
  }
  public Object peek() {
    Object result;
    if(isEmpty())
      result = null;
    else
      result = contents[top-1];
    return result;
  }
  public static void main(String[] args) {
    ArrayStack stack = new ArrayStack();
    System.out.println("将0到24依次压栈,然后连续10次出栈");
    for(int i = 0;i < 25;i++)
      stack.push(i);
    for(int i = 0;i < 10;i++)
      stack.pop();
    System.out.println("栈的大小为: " + stack.size());
    System.out.println("栈为空吗?: " + stack.isEmpty());
    System.out.println("栈顶元素为: " + stack.peek());
  }
}

运行结果:
将0到24依次压栈,然后连续10次出栈
栈的大小为: 15
栈为空吗?: false
栈顶元素为: 14

使用集合LinkedList来模拟栈
方法
java的泛型可以让LinkedList模拟存储各种数据类型的栈,包括int,double,String,Object等等,介绍一下几种用到的API接口:

入栈

  void addFirst(E e); // 将指定元素插入此列表的开头 

获取栈顶元素

  E getFirst(); // 返回此列表的第一个元素 

出栈

  E removeFirst(); // 移除并返回此列表第一个元素 

判栈空

  boolean isEmpty(); // 判断栈空 

示例代码

   

 import java.util.LinkedList;
  import java.util.NoSuchElementException; 

  public class SimulateStack {
    private LinkedList<Integer> stack = new LinkedList<Integer>(); 

    public boolean isEmpty() {
      return this.stack.isEmpty();
    } 

    public void push(int data) {
      this.stack.addFirst(data);
    } 

    public int pop() throws NoSuchElementException{
      return this.stack.removeFirst();
    } 

    public int getTop() throws NoSuchElementException{
      return this.stack.getFirst();
    } 

    public static void main(String args[]) {
      SimulateStack s = new SimulateStack(); 

      s.push(1);
      s.push(2);
      s.push(3); 

      while (! s.isEmpty()) {
        int data = s.getTop();
        System.out.println(data);
        s.pop();
      }
    }
  }

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索java

实现顺序栈的基本运算、栈的基本操作实现、java实现栈、java栈的实现、java实现堆栈,以便于您获取更多的相关知识。

时间: 2024-09-30 02:34:54

用Java代码实现栈数据结构的基本方法归纳_java的相关文章

利用java反射机制调用类的私有方法(推荐)_java

试想一下,如果你可以轻易地调用一个类的私有方法,那么是不是说你的封装都失效了?最近在看java的反射机制,发现居然可以利用java的反射机制去调用其他类的私有方法,至于这能干什么,那就见人见智了.. 我写的一段简易实例代码如下: import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; /** * @author thomaslwq * @version 创建时间:Sep 4, 201

JAVA读取属性文件的几种方法总结_java

1.使用java.util.Properties类的load()方法 示例: Java代码InputStream in = lnew BufferedInputStream(new FileInputStream(name));     Properties p = new Properties();     p.load(in);  2.使用java.util.ResourceBundle类的getBundle()方法  示例: Java代码ResourceBundle rb = Resour

Java从控制台读入数据的几种方法总结_java

这里记录Java中从控制台读入信息的几种方式,已备后查! (1)JDK 1.4(JDK 1.5和JDK 1.6也都兼容这种方法) public class TestConsole1 { public static void main(String[] args) { String str = readDataFromConsole("Please input string:); System.out.println("The information from console: + st

java中数组的定义及使用方法(推荐)_java

数组:是一组相关变量的集合 数组是一组相关数据的集合,一个数组实际上就是一连串的变量,数组按照使用可以分为一维数组.二维数组.多维数组 数据的有点 不使用数组定义100个整形变量:int i1;int i2;int i3 使用数组定义 int i[100]; 数组定义:int i[100];只是一个伪代码,只是表示含义的 一维数组 一维数组可以存放上千万个数据,并且这些数据的类型是完全相同的, 使用java数组,必须经过两个步骤,声明数组和分配内存给该数组, 声明形式一 声明一维数组:数据类型

java POI解析Excel 之数据转换公用方法(推荐)_java

如下所示: public static String reThreeStr(String ss){ boolean result= ss.matches("^[-+]?(([0-9]+)([.]([0-9]+))?|([.]([0-9]+))?)$"); if(result&&ss!=null&&!"".equals(ss)){ Double sss=Double.valueOf(ss); String numStr=new java

java判断字符串是否为数字的方法小结_java

本文实例总结了java判断字符串是否为数字的方法.分享给大家供大家参考,具体如下: 方法一:用JAVA自带的函数 public static boolean isNumeric(String str){ for (int i = str.length();--i>=0;){ if (!Character.isDigit(str.charAt(i))){ return false; } } return true; } 方法二:用正则表达式 public static boolean isNume

改善JAVA代码01:考虑静态工厂方法代替构造器

正文  静态工厂方法代替构造器 说起这个,好多可以念叨的.做了一年多的项目,慢慢也有感触. 说起构造器 大家很明白,构造器可以让我们在何处何地获取自身或者他人一个实例.我们是无忌惮的使用着 new 却从来没考虑过人家的感受.其实new ,new一个对象,就是开辟一块内存空间给这个对象.如果何处何地,都new的话,漫山遍野... 五颜六色的new ,本质却一样   一句话:构造器虽是万能,但是要珍惜. 再谈谈 静态工厂方法 静态工厂方法,顾名思义,只是一个返回类实例的静态方法.这里有个不切当的比喻

java 全角半角字符转换的方法实例_java

如果搞明白了Java中全角字符和半角字符之间的关系那他们之间的转换根本就不是个事. 可以通过下面的程序看看Java中所有字符以及对应编码的值 复制代码 代码如下:     public static void main(String[] args) {        for (int i = Character.MIN_VALUE; i <= Character.MAX_VALUE; ++i) {            System.out.println(i + "    "

Java函数式编程(八):字符串及方法引用_java

第三章 字符串,比较器和过滤器 JDK引入的一些方法对写出函数式风格的代码很有帮助.JDK库里的一些的类和接口我们已经用得非常熟悉了,比如说String,为了摆脱以前习惯的那种老的风格,我们得主动寻找机会来使用这些新的方法.同样,当我们需要用到只有一个方法的匿名内部类时,我们现在可以用lambda表达式来替换它了,不用再像原来那样写的那么繁琐了. 本章我们会使用lambda表达式和方法引用来遍历字符串,实现Comparator接口,查看目录中的文件,监视文件及目录的变更.上一章中介绍的一些方法还