栈-链栈的基本操作及实现

栈-链栈的基本操作及实现_第1张图片

链栈的存储结构可用单链表来实现,假设指针指向单链表的首结点,由于在栈中入栈河出栈操作只能在栈顶进行,不存在在单链表任意位置进行插入和删除操作的情况,所以在栈中不需要设置头结点直接将栈顶元素放在单链表的首部成为首结点


链栈类的描述:
链栈中的结点类引用了链表中所讨论的Node类。下面是实现Stack的java语言描述
package com.stackTest;

import com.test1.Node;

public class LinkStack implements Stack
{

private  Node  top;//栈顶元素的引用
//将栈置空
@Override
public void clear()
{
      top = null;       
}

//判断栈是否为空
@Override
public boolean isEmpty()
{
    return  top == null;
}

@Override
public int length()
{
    // TODO Auto-generated method stub
    return 0;
}

//取出栈顶元素并且返回其值
@Override
public Object peek()
{
    if(!isEmpty())
    {
        return top.getData();
    }
    else
    {
        return  null;
    }
}

@Override
public void push(Object x) throws Exception
{
    // TODO Auto-generated method stub

}

@Override
public Object pop()
{
    // TODO Auto-generated method stub
    return null;
}

//输出栈中的所有元素(从栈顶到栈底)
public   void  display()
{
    Node  p =top;   //p指向栈顶元素
    while(p != null)
    {
        System.out.println((p.getData()).toString() + "");//输出所有非空结点的数据元素值
        p = p.getNext();     //p指针向后移动
    }

}

}

————————————————————

下面介绍链栈的长度,入栈河出栈操作

1.求链栈的长度操作。求链栈长度操作的基本要求是计算出链栈中说包含数据元素的个数并且返回其值,此操作的基本思想与求单链表长度相同:引用一个指针p和一个技术变量length ,p的初始状态指向栈顶元素,length的初始值为0;然后逐个进行计数,即p沿着链栈中的后继指针逐个移动,同时length逐个加1,直至p指向空为止,此时length值几位链栈的长度值。

算法如下:
public int length()
{
Node p = top; //p指向栈顶元素
int length = 0; //计数器
while(p != null) //从栈顶元素开始向后查找,直到p为空
{
p = p.getNext(); //p指向后继结点
++length; //长度加1
}

    return length;
}

链栈的入栈操作算法:

public void push(Object x) throws Exception
{
Node p =new Node(x); //构造一个新结点
p.setNext(top);
top = p; //新结点成为当前的首结点

}

链栈的出栈操作算法:
判断链栈是否为空,若为空,则结束操作并返回null,否则,到下一步
确定被删结点是栈顶结点
修改相关指针域的值,使栈顶结点从链栈中移去,并返回被删结点数据域的值。

public void display()
{
Node p =top; //p指向栈顶元素
while(p != null)
{
System.out.println((p.getData()).toString() + “”);//输出所有非空结点的数据元素值
p = p.getNext(); //p指针向后移动
}

}

——————————————

链栈操作的完整代码:

package com.stackTest;

import com.test1.Node;

public class LinkStack   implements Stack
{

    private  Node  top;//栈顶元素的引用
    //将栈置空
    @Override
    public void clear()
    {
          top = null;       
    }

    //判断栈是否为空
    @Override
    public boolean isEmpty()
    {
        return  top == null;
    }

    @Override
    public int length()
    {
        Node  p = top;    //p指向栈顶元素
        int  length = 0;  //计数器
        while(p != null)   //从栈顶元素开始向后查找,直到p为空
        {
            p = p.getNext();  //p指向后继结点
            ++length; //长度加1
        }

        return length;
    }

    //取出栈顶元素并且返回其值
    @Override
    public Object peek()
    {
        if(!isEmpty())
        {
            return top.getData();
        }
        else
        {
            return  null;
        }
    }

    @Override
    public void push(Object x) throws Exception
    {
        Node  p =new Node(x);   //构造一个新结点
        p.setNext(top);
        top = p;   //新结点成为当前的首结点

    }

    @Override
    public Object pop()
    {
          if(isEmpty())
          {
                 return  null;
          }
          else
          {
                 Node  p = top;     //p指向被删除的结点
                 top=top.getNext();  //修改链指针,使栈顶结点从链栈中移去
                 return  p.getData();  //返回数据域的值
          }
    }

    //输出栈中的所有元素(从栈顶到栈底)
    public   void  display()
    {
        Node  p =top;   //p指向栈顶元素
        while(p != null)
        {
            System.out.println((p.getData()).toString() + "");//输出所有非空结点的数据元素值
            p = p.getNext();     //p指针向后移动
        }

    }


}

你可能感兴趣的:(数据结构与算法)