数据结构-线性表-栈的代码详解

栈与队列,是仅在表尾进行操作的线性表,均有顺序结构和链式结构

先入先出为队列,即 输入 1 2 3 4 5,打印出 1 2 3 4 5

先入后出为栈,即 输入 1 2 3 4 5,打印出 5 4 3 2 1

这里详解栈的顺序结构和链式结构,代码最后附上!!!!!

一。顺序栈

                          代码结构  两包 一接口,五类  

 顺序栈所在Stack包

1.Stack.java 栈接口类,下面的链栈也用到此接口

                

2.顺序栈对象   Mystack.java

              

              

              

              

3.测试类  Test.java

4.运行结果

                 

二。链栈。所用到以上的stack接口!!!!!一定记得用到了stack接口

     1.Stack.java 在上面,有的方法不需要实例化使用

     2.Node.java节点类

         

   3.LinkedStack.java   链栈对象类

       

       

 

        

         

3.Test.java 测试类

4.运行结果

      

代码附上!!

第一部分:

Stack.java

package Stack;

//定义栈模板
public interface Stack<E> {
//判断是否为空栈
    public boolean Isempty() ;
    //判断栈是否满了 
    public boolean Isfull();
    
    //入栈
    public void push(E e);
    //出栈
    public void pop();
    
    //栈的长度
    public int Length();
    
    //打印栈中所有元素
    public void FindALL();
    //打印栈顶元素
    public void FindOne();
    
}
 

Mystack.java

package Stack;

//定义一个顺序结构的栈 实现Stack接口
public class MyStack<E> implements Stack<E> {
    
    //定义栈的最大容量,若有兴趣你可以尝试增加一个方法,使其满栈时增加容量
    public int Maxsize =10;
    //定义数据域,即储存数据的地方
    public Object[] obj = null;
    //定义栈顶指针,因为顺序结构从零开始计数,所以定义指针为-1,因为指针若为0,表示第一个数据已经存储在里面了
    public int top = -1;
    
//构造函数分为两块,一块是用户不想自己设置最大容量,一块是用户自己输入最大容量
    MyStack(){
        this.obj = new Object[Maxsize];
    }
    
    public MyStack(int Maxsize) {
        this.Maxsize = Maxsize;
        this.obj = new Object[Maxsize];
        // TODO Auto-generated constructor stub
    }
    @Override
    public boolean Isempty() {
        // TODO Auto-generated method stub
        if(top < 0) return true;
        else  return false;
    }

    @Override
    public boolean Isfull() {
        // TODO Auto-generated method stub
    if(top < Maxsize)    return false;
    else  return true;
    
    }

    @Override
    public void push(E e) {
        // TODO Auto-generated method stub    
        if(Isfull()) {
            try {
                throw new Exception("满栈无法进行入栈操作");
            } catch (Exception e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
        }
        //栈顶上移,增加新数据
        top++;
        obj[top]=e;        
    }

    @Override
    public void pop() {
        // TODO Auto-generated method stub
        if(Isempty()) {
            try {
                throw new Exception("空栈无法进行操作");
            } catch (Exception e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
        }
        //打印此时栈顶的元素
        System.out.println("此次出栈元素为"+obj[top]);
        //直接更新栈顶
        top--;
        
    }

    @Override
    public int Length() {
        // TODO Auto-generated method stub
        return this.top+1;
    }

    @Override
    public void FindALL() {
        // TODO Auto-generated method stub
        //因为栈是先进后出,所以在打印数组时进行倒序打印即可
        System.out.println("栈中储存的数据是");
        for(int j=top;j>=0;j--) {
            System.out.print(obj[j]+" ");
        }
        
    }

    @Override
    public void FindOne() {
        // TODO Auto-generated method stub    
        if(Isempty()) {
            try {
                throw new Exception("空栈无法进行操作");
            } catch (Exception e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
        }
        System.out.println("此时栈顶元素为"+ obj[top]);
    }

}
 

Test.java

package Stack;

public class Test {
    public static void main(String[] args) {
        //实例化一个栈
        MyStack<String> myStack = new MyStack<String>();
        //入栈五条数据
        myStack.push("一");
        myStack.push("棵");
        myStack.push("大");
        myStack.push("白");
        myStack.push("菜");
        
        //打印栈中数据与栈顶数据
        myStack.FindALL();
        myStack.FindOne();
        
        //首位元素出栈,再次打印栈中数据与栈顶数据
        myStack.pop();
        myStack.FindALL();
        myStack.FindOne();    
    } 
}
 

第二部分!!

Node.java

package StackLink;
/*
 * 定义节点类,后续合成链表或者对链表进行操作
 * */
public class Node<E> {
//节点储存的变量
    public Object data;
    //指向下一个节点
    public Node next = null;
    public Node(E data) {
        this.data = data;
    }
}
 

LinkedStack.java

package StackLink;

import Stack.Stack;

//切记链式存储下的栈不考虑满不满,毕竟他满不满是由电脑物理内存决定的,而不是认为定义的,
//而这里我比较懒,直接继承了上一个顺序存储栈中的stack模型,所以我对Isfull方法不进行实例化
public class LinkedStack<E> implements Stack<E> {
    //定义栈顶,目前是空栈,所以定义出来的节点为null
    Node<E> top = null;
    //监听节点数量
    int i=0;
        
    @Override
    public boolean Isempty() {
        // TODO Auto-generated method stub
        if(top!=null) return false;
        else return true;
    }
    @Override
    public boolean Isfull() {
        // TODO Auto-generated method stub
        return false;
    }
    @Override
    public void push(E e) {
        // TODO Auto-generated method stub
        Node<E> newNode = new Node<E>(e);
        //每次新输入的节点都会成为top,而旧节点则被top的next指向
        if(Isempty()) {
            top = newNode;
        }
        else {
        Node<E> temp = top;
        top = newNode;
        top.next = temp;
        }
        i++;
    }
    @Override
    public void pop() {
        // TODO Auto-generated method stub
        if(Isempty()) {
            try {
                throw new Exception("空栈,不能进行出栈操作!!!");
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        //让栈顶处节点直接变为null,就变相的把节点前一元素的next指向了null,也就把该节点出栈了
        top = top.next;    
        i--;
    }
    @Override
    public int Length() {
        // TODO Auto-generated method stub
        return i;
    }
    @Override
    public void FindALL() {
        // TODO Auto-generated method stub
        if(Isempty()) {
            try {
                throw new Exception("空栈无法进行操作");
            } catch (Exception e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
        }
        Node<E> mdNode = top;
        while(mdNode!=null){
            System.out.print(mdNode.data+" ");
            mdNode = mdNode.next;
        }
    
    }
    @Override
    public void FindOne() {
        // TODO Auto-generated method stub
        if(Isempty()) {
            try {
                throw new Exception("空栈无法进行操作");
            } catch (Exception e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
        }
        System.out.println("栈顶数据为"+top.data);    
    }
    
}
 

Test.java

package StackLink;


public class Test {
    public static void main(String[] args) {
        //实例化一个栈
        LinkedStack<String> myStack = new LinkedStack<String>();
        //入栈五条数据
        myStack.push("一");
        myStack.push("棵");
        myStack.push("大");
        myStack.push("白");
        myStack.push("菜");
        
        //打印栈中数据与栈顶数据
        myStack.FindOne();
        myStack.FindALL();
        
        //删除栈顶
        myStack.pop();
        System.out.println();
        
        //打印栈中数据与栈顶数据
                myStack.FindOne();
                myStack.FindALL();
    
    } 
}
 

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值