zoukankan      html  css  js  c++  java
  • 大话数据结构----栈

    栈的定义:

    栈(stack)是限定尽在表尾进行插入和删除操作的线性表。

    从定义中可以看出,栈也是线性表,是一个特殊的线性表,之前说线性的表的时候,线性表可以在任意位置进行插入插入,而栈比线性表特殊的地方的就是不能随意的插入和删除了,栈的插入和删除只能在规定的同一端进行,而被允许插入和删除的一端称为栈顶,另一端称为栈底。

    栈

    从栈的特性中我们能发现:1).栈是一种后进先出的线性表,因为栈只有一个出入口,每次出栈是最后进的那个先出去,后一个才能出去,就像我们出电梯一样,里面的人被阻住,只有外面的人出去,里面的人才能出去。

    2)栈的栈顶是在变化的,所以栈还得有一个栈顶指针,新元素入栈的后,栈顶指针要指向新栈顶,栈顶栈顶元素出栈时,栈顶指针也是需要变化指向新的栈顶

    栈的 三种状态-----栈空、栈满、栈未满

    栈的三种状态

    栈空时:栈顶指针(top)=-1

    栈满时:栈顶指针(top)=MAXSIZE-1;

    栈未满:就是占中存在元素,top指针还未达到MAXSIZE-1.

    进栈和出栈操作

    进栈

    进栈

    1).判断栈是否已经满了,如果满了当然就入不了栈。

    2)、栈顶指针+1,在新栈顶位置存入要进栈的元素。

    出栈:

    出栈

    1).判断栈是否为空,里面没有数据先出栈也没有。

    2).将栈顶元素出栈,栈顶指针-1.

    Java 实现栈的基本操作

    package JavaStack;
    import javax.swing.table.TableColumn;
    
    /* 
    * 项目名称:JavaStack 
    * @author:wzc
    * @date 创建时间:2017年9月10日 下午2:22:08
    * @Description:数据结构----栈
    * @parameter  
    *   */
    public class Stack<T> {
       public static final int MAXSIZE=10;
    private static final int T = 0;
       private T [] date=(T[])new Object[MAXSIZE];
       int top;
       public Stack() {
        top=-1;
       }
       //判断栈是否为空
       public boolean isEmpty(){
           if (top==-1) {
            return true;
           }
            return false;
       }
       //判断栈是否满
       public boolean isFull(){
           if (top==MAXSIZE-1) {
            return true;
        }
           return false;
       }
       /*Method:push
         *Description:入栈操作
         *param:T date  入栈的数据元素
         */
       public void push(T date){
           //1.入栈之前判断是否栈满
           if (isFull()) {
               System.out.println("栈已经满了");
               return;
           }
           top=top+1;
           this.date[top]=date;
           System.out.println(date+"已经入栈");
       }
       /*Method:enclosing_method
         *Description:出栈操作
         *param:
         */
       public T pop(){
           //出栈之前判断呢栈是否为空
           if (isEmpty()) {
            System.out.println("栈为空,无可出栈数据");
            return null;
          }
           T date= this.date[top];
           top=top-1;
           return date;  
       }
       //输出栈 中有多少元素
       public int getLength(){
           return top+1;
       }
       //输出栈中所有元素
       public void getDate(){
           for(int  i=0;i<=top;i++){
               System.out.print(date[i]+" ");
           }
           System.out.println();
       }
       
    }

    测试一下:

    @Test
        public void test() {
            Stack <Integer> stack=new Stack<>();
            int length = stack.getLength();
            System.out.println("栈长:"+length);
            stack.push(2);
            System.out.println("栈长"+stack.getLength());
            stack.push(5);
            stack.push(9);
            System.out.println("栈长"+stack.getLength());
            stack.getDate();
            Integer pop = stack.pop();
            System.out.println(pop+"出栈");
            System.out.println("栈长"+stack.getLength());
            stack.getDate();
            stack.pop();
            stack.pop();
            System.out.println("栈长"+stack.getLength());
            stack.getDate();
            stack.pop();
        }

    测试结果::

    结果‘

    共享栈

    共享栈

    共享栈 是开辟一块内存空间,两个栈结构共用这一块内存空间,每个栈占领这块空间的一头。

    要求:两个栈的数据类型要相同。

    栈满:判断栈满的条件是----top1+1=top2

    栈满

    栈空: 1.第一个栈空的条件:top=-1

              2.第二个栈空的 条件:top2=MAXSIZE

    在两个栈对于空间需求相反的时候,利用共享栈可以有效的节约空间。

    package JavaStack;
    /* 
    * 项目名称:JavaStack 
    * @author:wzc
    * @date 创建时间:2017年9月10日 下午3:07:28
    * @Description:共享栈
    * @parameter  
    *   */
    public class DoubleStack<T> {
        public static final int MAXSIZE=10;
        private T [] date=(T[])new Object[MAXSIZE];
        int top1;
        int top2;
        public DoubleStack() {
            top1=-1;
            top2=MAXSIZE;
        }
         //判断栈1是否为空
           public boolean isEmpty1(){
               if (top1==-1) {
                return true;
               }
                return false;
           }
           //判断栈2是否为空
           public boolean isEmpty2(){
               if (top2==MAXSIZE) {
                return true;
               }
                return false;
           }
           //判断栈是否满
           public boolean isFull(){
               if (top1+1==top2) {
                return true;
            }
               return false;
           }
           /*Method:push
             *Description:入栈操作
             *param:T date  入栈的数据元素,StackNum   哪个栈
             */
           public void push(T date,int StackNum){
               //1.入栈之前判断是否栈满
               if (isFull()) {
                   System.out.println("栈已经满了");
                   return;
               }
               if (StackNum==1) {
                   top1=top1+1;
                   this.date[top1]=date;
                   System.out.println(date+"已经入栈");
               }else if (StackNum==2) {
                   top2=top2-1;
                   this.date[top2]=date;
                   System.out.println(date+"已经入栈");
               }
               
           }
           /*Method:enclosing_method
             *Description:出栈操作
             *param:StackNum ,哪个栈
             */
           public T pop(int StackNum){
               //第一个栈出栈
               if (StackNum==1) {
                 //出栈之前判断呢栈是否为空
                   if (isEmpty1()) {
                        System.out.println("栈为空,无可出栈数据");
                        return null;
                      }
                       T date= this.date[top1];
                       top1=top1-1;
                       return date;  
               }else   if (StackNum==2) {//第二个栈出栈
                 //出栈之前判断呢栈是否为空
                   if (isEmpty2()) {
                        System.out.println("栈为空,无可出栈数据");
                        return null;
                      }
                       T date= this.date[top2];
                       top2=top2+1;
                       return date;  
               }
               //栈错误
               return null;
              
           }
           
           
           
    }

    栈的链式存储结构

    链式

    利用单链表的思想,栈中元素在内存中的存储位置是随机的,只需要它的前驱能找到就行,然后对数据的操作仍然是从栈顶操作,依旧是后进先出。

    对于进栈、出栈的实现思想还是一样。

    入栈:

    入栈2

    1.入栈元素的指针域指向当前栈顶指针top指向的元素。

    2.top指针+1,指向新的栈顶元素。

    出栈

    出栈2

    1.将出栈元素出栈;

    2.将top指针-1,指向下一个元素;

    package JavaStack;
    /* 
    * 项目名称:JavaStack 
    * @author:wzc
    * @date 创建时间:2017年9月10日 下午3:26:54
    * @Description:链式存储栈结构
    * @parameter  
    *   */
    public class LinkStack <T>{
        
        private class StackNode{
            T date;
            StackNode next;
        }
        private  StackNode top;
        private  int count;
        public LinkStack() {
            count =0;
            top=null;
        }
        //判读是否为空
        public boolean isEmpty(){
            if (count==0) {
                return true;
            }
            return false;
        }
        /*Method:push
         *Description:入栈操作
         *param:date 入栈元素
         */
        public void push(T date){
            StackNode newNode=new StackNode();
            newNode.date=date;
            newNode.next=top;
            top=newNode;
            count++;
            System.out.println(date+"入栈");
        }
        /*Method:pop
         *Description:出栈操作
         *param:
         */
        public T pop(){
            if (isEmpty()) {
                return null;
            }
            StackNode date=top;
            top=top.next;
            date.next=null;
            System.out.println(date.date+"出栈");
            return  date.date;
        }
        
        public void getDate(){
            StackNode tmp=top;
            while(tmp!=null){
                System.out.print(tmp.date+" ");
                tmp=tmp.next;
            }
            System.out.println();
        }
       
    }
  • 相关阅读:
    二叉树非递归先中后序遍历 及 非递归交换二叉树两个孩子的位置
    COM 学习小记录
    Linux 信号量 生产者消费者小例题
    打印数字 形状有点得味
    (链表)链表倒序
    C++ 数组名作为函数参数 都是我的错
    进程 线程
    《C++ Qt 设计模式》8|15拼图 小游戏的简单实现。拜托,别乱点!
    PMAC运动程序例程(一)
    中国获得2022年冬奥会举办权【经济学人】
  • 原文地址:https://www.cnblogs.com/Actexpler-S/p/7501361.html
Copyright © 2011-2022 走看看