• 栈的实现


    首先来了解下栈的特点:

      First in last out :先进后出

      包扩入栈,出栈。以及对栈空,栈满的判断

      这里包括了两种实现方法:

      数组实现

      链表实现

    数组实现:

      

    package yaobo.stack;
    /** 
     * 使用数组实现堆栈,包括入栈、出栈、获取堆栈长度、 
     * @author yaobo 
     */  
    public class Stack {        
        
      Object[] data;  
        
      int maxSize;    
      //栈顶位置  
      int top;        
        
      public Stack(int maxSize) {        
          this.maxSize = maxSize;        
          data = new Object[maxSize];        
          top = -1;        
      }        
         
      /** 
       * 获取堆栈长度 
       * @return 堆栈长度 
       */  
      public int getSize()  
      {  
        return maxSize;  
      }  
        
      /** 
       * 返回栈中元素的个数 
       * @return 栈中元素的个数 
       */  
      public int getElementCount()  
      {  
        return top;  
      }  
        
      /** 
       * 判断栈空 
       * @return 栈空 
       */  
      public boolean isEmpty()  
      {  
        return top == -1;  
      }  
        
      /** 
       * 判断栈满 
       * @return 栈满 
       */  
      public boolean isFull()  
      {  
        return top+1 == maxSize;  
      }  
        
      /**     
       * 依次加入数据     
       * @param data 要加入的数据通信     
       * @return 添加是否成功     
       */        
      public boolean push(Object data) {        
        if(isFull())   
        {        
            System.out.println("栈已满!");        
            return false;        
        }        
        this.data[++top] = data;        
        return true;        
      }        
              
      /**     
       * 从栈中取出数据     
       * @return 取出的数据     
       */        
      public Object pop() throws Exception{        
        if(isEmpty())   
        {        
            throw new Exception("栈已空!");        
        }        
        return this.data[top--];        
      }        
        
      /** 
       * 返回栈顶元素 
       * @return 
       */  
      public Object peek()  
      {  
        return this.data[getElementCount()];    
      }  
      
      
      public static void main(String[] args) throws Exception {        
          Stack stack=new Stack(1000);        
          stack.push(new String("1"));        
          stack.push(new String("2"));        
          stack.push(new String("3"));        
          stack.push(new String("4"));        
          stack.push(new String("5"));    
          System.out.println(stack.peek());   
                  
          while(stack.top>=0)        
          {        
              System.out.println(stack.pop());        
          }               
      }        
    }       

    链表实现:

      

    package yaobo.stack;
    /** 
     * 表示链表的一个节点 
     * @author yaobo 
     */  
    
      
    /** 
     * 用链表实现堆栈 
     * @author Adair 
     */  
    public class ListStack  
    {  
      Node header;  //栈顶元素  
      
      int elementCount;// 栈内元素个数  
      
      int size;// 栈的大小  
      
      //以这个内部类来表示链表
      class Node{  
          Object element;  
          Node next;  
            
          public Node(Object element) {  
              this(element, null);  
          }  
          
          public Node(Object element, Node n) {  
              this.element = element;  
              next = n;  
          }  
          
          public Object getElement() {  
              return element;  
          }  
          
          public void setElement(Object element) {  
              this.element = element;  
          }  
          
          public Node getNext() {  
              return next;  
          }  
          
          public void setNext(Node next) {  
              this.next = next;  
          }  
        }  
      
      /** 
       * 构造函数,构造一个空的堆栈 
       */  
      public ListStack()  
      {  
        header = null;  
        elementCount = 0;  
        size = 0;  
      }  
      
      /** 
       * 通过构造器 自定义栈的大小 
       * @param size 栈的大小 
       */  
      public ListStack(int size)  
      {  
        header = null;  
        elementCount = 0;  
        this.size = size;  
      }  
      
      /** 
       * 设置堆栈大小 
       * @param size 堆栈大小 
       */  
      public void setSize(int size)  
      {  
        this.size = size;  
      }  
      
      /** 
       * 设置栈顶元素 
       * @param header 栈顶元素 
       */  
      public void setHeader(Node header)  
      {  
        this.header = header;  
      }  
      
      /** 
       * 获取堆栈长度 
       * @return 堆栈长度 
       */  
      public int getSize()  
      {  
        return size;  
      }  
      
      /** 
       * 返回栈中元素的个数 
       * @return 栈中元素的个数 
       */  
      public int getElementCount()  
      {  
        return elementCount;  
      }  
      
      /** 
       * 判断栈是否为空 
       * @return 如果栈是空的,返回真,否则,返回假 
       */  
      public boolean isEmpty()  
      {  
        if (elementCount == 0)  
          return true;  
        return false;  
      }  
      
      /** 
       * 判断栈满 
       * @return 如果栈是满的,返回真,否则,返回假 
       */  
      public boolean isFull()  
      {  
        if (elementCount == size)  
          return true;  
        return false;  
      }  
      
      /** 
       * 把对象入栈 
       * @param value 对象 
       */  
      public void push(Object value)  
      {  
        if (this.isFull())  
        {  
          throw new RuntimeException("Stack is Full");  
        }  
        header = new Node(value, header);  
        elementCount++;  
      }  
      
      /** 
       * 出栈,并返回被出栈的元素 
       * @return 被出栈的元素 
       */  
      public Object pop()  
      {  
        if (this.isEmpty())  
        {  
          throw new RuntimeException("Stack is empty");  
        }  
      
        Object obj = header.getElement();  
      
        header = header.getNext();  
      
        elementCount--;  
        return obj;  
      }  
      
      /** 
       * 返回栈顶元素 
       * @return 栈顶元素 
       */  
      public Object peek()  
      {  
        if (this.isEmpty())  
        {  
          throw new RuntimeException("Stack is empty");  
        }  
      
        return header.getElement();  
      }  
      
      public static void main(String[] args) throws Exception {        
          ListStack stack=new ListStack(1000);        
          stack.push(new String("1"));        
          stack.push(new String("2"));        
          stack.push(new String("3"));        
          stack.push(new String("4"));        
          stack.push(new String("5"));    
          System.out.println(stack.peek());   
                  
          while(stack.header!=null)        
          {        
              System.out.println(stack.pop());        
          }               
      } 
    }  
  • 相关阅读:
    [转] 股票基础知识
    [原] combobox如何让用户不能输入只能从下拉列表里面选择
    【原】2个面试问题(与同事李将的交流)
    [转] 纯代码取得本机IP地址
    [转] 关于硬盘修复以及低级格式化的一些文章
    [转] 130道C#面试题
    初学Sockets编程(四) 发送和接收数据
    利用Beyond Compare比较文件
    第三日:SimuLink之后是Stateflow
    简单的RPC编程实践——HelloWorld的实现
  • 原文地址:https://www.cnblogs.com/yaobolove/p/6492460.html
Copyright © 2020-2023  润新知