数据结构基础 栈的详解
Posted 有头发的程序猿#
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构基础 栈的详解相关的知识,希望对你有一定的参考价值。
一.栈的定义
栈(stack)是一种特殊的线性表,是一种只允许在表的一端进行插入或删除操作的线性表。表中允许进行插入和删除操作的一端称为栈顶,最下面的那一端称为栈底。栈顶是动态的,它由一个称为栈顶指针的位置指示器指示。当栈中没有数据元素时,称之为空栈。栈的插入操作也称为进栈或入栈,栈的删除操作称为出栈或退栈。
栈的特点是先进后出
二.栈的基本操作
初始栈:创建一个空栈
入栈:在栈顶添加一个数据元素
出栈:删除栈顶数据元素
取栈顶元素:获取栈中当前栈顶的数据元素,栈中数据元素不变
求栈长度:获取栈中的数据元素个数
判断栈空:判断栈中是否有数据元素
三.栈的抽象数据类型
ADT 栈(stack)
数据元素 可以是任意类型,只要同属一个数据对象即可;
数据关系 数据元素之间呈线性关系,假设栈中有n个元素(a1, a2,a3,…,an),则对
每一个元素ai(i=1,2,…,n-1)都存在关系(ai,ai+1),并且a1无前趋,an无后继。
数据操作 将对栈的基本操作定义在接口IStack中,代码如下:
public interface IStack<E>
E push(E item);//入栈
E pop(); //出栈
E peek(); //取栈顶元素
int size(); //求栈的长度
void clear();//清空栈
boolean isEmpty(); //判断栈是否为空
四.用顺序栈实现栈
1.顺序栈的存储结构:
用一片连续的存储空间来存储栈中的数据元素,这样的栈称为顺序栈(sequence stack)。
栈顶指示器top设在数组第一个元素前面的位置,top随着插入和删除而变化,当栈为空时,top=-1
2.实现顺序栈的接口
public interface IStack<E>
E push(E e); //入栈
E pop(); //出栈
E peek();//取栈顶元素
boolean isEmpty();//判断栈是否为空
int size();//栈的尺寸
void clear();//清空栈
3.实现顺序栈
public class SeqStack<E> implements IStack<E>
private int maxsize; //栈的最大容量
private int top; //栈顶指针
private Object arr[];
public SeqStack(int maxsize)
arr = new Object[maxsize];
this.maxsize = maxsize;
top=-1;
public E push(E e)
if(!isFull())
arr[++top] = e;
return e;
return null;
public E pop()
if(!isEmpty())
return (E) arr[top--];
return null;
public E peek()
if(!isEmpty())
return (E) arr[top];
return null;
public boolean isEmpty()
if(top == -1)
return true;
else return false;
public int size()
if(!isEmpty())
return top+1;
return 0;
public void clear()
if (!isEmpty())
top=-1;
public boolean isFull()
if (top == maxsize)
return true;
else return false;
4.测试顺序栈
public class TestSeqStack
public static void main(String []args)
Integer data[] =1,24,32,3,33;
SeqStack<Integer> seqStack = new SeqStack<Integer>(5);
System.out.println("*******************");
for(int i= 0;i<5;i++)
System.out.print("入栈:"+data[i]);
seqStack.push(data[i]);
System.out.println();
System.out.println("*******************");
while(true)
if(seqStack.isEmpty())
break;
System.out.print("出栈:"+seqStack.pop().intValue());
System.out.println();
五.用链栈实现栈
1.链栈的存储结构
用链式存储结构存储的栈称为链栈(linked stack)。链栈通常用单链表来表示。
链栈结点的结构与单链表结点的结构一样,由数据域data和引用域next两部分组成。
栈顶指示器指向最后一个入链的元素。
2.单链节点
public class StackNode<E>
private E data;
private StackNode<E> next; //指向下一个节点
public StackNode()
public StackNode(E data)
this.data = data;
public StackNode(E e, StackNode<E> e1)
this.data = e;
this.next = e1;
public E getData()
return data;
public void setData(E data)
this.data = data;
public StackNode<E> getNext()
return next;
public void setNext(StackNode<E> next)
this.next = next;
3.单链节点实现链栈
public class LinkStack<E> implements IStack<E>
private StackNode<E> top;
private int size;
public LinkStack()
top = new StackNode<E>(null,null);
size=0;
public E push(E e)
StackNode<E> node = new StackNode<E>(e,top.getNext());
top.setNext(node);
size++;
return e;
public E pop()
if(top.getNext() !=null)
E e = top.getNext().getData();
top.setNext(top.getNext().getNext());
size--;
return e;
return null;
public E peek()
if(top.getNext()!=null)
return top.getNext().getData();
return null;
public boolean isEmpty()
if(top.getNext()!=null)
return false;
return true;
public int size()
return size;
public void clear()
top.setNext(null);
4.测试
public class TestLinkStack
public static void main(String []args)
Integer data[] =1,24,32,3,33;
LinkStack<Integer> linkStack = new LinkStack<Integer>();
System.out.println("*******************");
for(int i= 0;i<5;i++)
System.out.print("入栈:"+data[i]);
linkStack.push(data[i]);
System.out.println();
System.out.println("*******************");
while(true)
if(linkStack.isEmpty())
break;
System.out.print("出栈:"+linkStack.pop().intValue());
System.out.println();
六.总结
到了这里,栈的知识大概就差不多了解了。
如果有什么问题,欢迎大家评论指出,3q!
附上视频教学连接:
中国MOOC数据结构
以上是关于数据结构基础 栈的详解的主要内容,如果未能解决你的问题,请参考以下文章