第三章:栈和队列
文章目录
目录
顺序栈:采用顺序存储的栈称为顺序栈,它利用一组地址连续的存储单元存放自栈底到栈顶的元素,同时附设一个指针(top)指示当前栈顶的位置。
链栈:采用链式存储的栈称为链栈,链栈便于多个栈共享存储空间和提高其效率,且不存在栈满上溢的情况。通常采用单链表实现,并且所有操作都是在单链表的表头进行的。
2.栈满条件:top=capacity - 1,这里采用动态扩展容量的方式,即栈满时将data数组的容量扩大两倍。
3.进栈e操作:先将栈顶指针top增1,然后将元素e放在栈顶指针处。
4.退栈操作:先将栈顶指针top处的元素取出,然后将栈顶指针减1。 注意: 栈内元素没删除。
2.栈满条件:只有在内存溢出的时候才会出现栈满,通常不考虑这种情况。
前言
难度适中,请放心食用!!!
一、栈的定义和特点
栈(Stack)是只允许在一端进行插入或删除操作的线性表。
栈顶Top:线性表允许插入和删除的那一端。
栈底Bottom:固定的,不允许进行插入和删除的另一端。
可视化网站如下:
Array Stack Visualizationhttps://www.cs.usfca.edu/~galles/visualization/StackArray.html
栈的特点:1. 后进先出,后进栈的元素先出栈。
2.只能在栈顶进行插入和删除操作。
二、栈的存储和基本操作
栈有两种存储方式:顺序栈和链栈
顺序栈:采用顺序存储的栈称为顺序栈,它利用一组地址连续的存储单元存放自栈底到栈顶的元素,同时附设一个指针(top)指示当前栈顶的位置。
链栈:采用链式存储的栈称为链栈,链栈便于多个栈共享存储空间和提高其效率,且不存在栈满上溢的情况。通常采用单链表实现,并且所有操作都是在单链表的表头进行的。
1.顺序栈的存储及基本运算算法的实现
顺序栈的四要素:
-
1.栈空条件:top==-1。
-
2.栈满条件:top=capacity - 1,这里采用动态扩展容量的方式,即栈满时将data数组的容量扩大两倍。
-
3.进栈e操作:先将栈顶指针top增1,然后将元素e放在栈顶指针处。
-
4.退栈操作:先将栈顶指针top处的元素取出,然后将栈顶指针减1。 注意: 栈内元素没删除。
顺序栈泛型类SqStackClass<E>设计如下:
public class SqStackClass <E>//顺序栈泛型类
{
final int initcapacity = 10;//顺序栈的初始容量(常量)
private int capacity;//存放栈的容量
private E[] data;//存放顺序栈的元素
private int top;//存放栈顶指针
public SqStackClass(int newcapacity)//构造方法,实现初始化data,top
{
data = (E[]) new Object[newcapacity];//强制转换成E类型数据
capacity = newcapacity;
top = -1;
}
private void updatecapacity(int newcapacity)//改变顺序栈的容量为newcapacity
{
E[] newdata = (E[]) new Object[newcapacity];
for (int i=0;i<= top;i++)//复制原来的元素
newdata[i]=data[i];
capacity = newcapacity;//设置新容量
data = newdata;//仍有data标识数组
}
//栈的基本运算算法
}
顺序栈基本运算算法如下:
public class J1<E>{
//顺序栈的基本运算算法
public boolean empty()//判断栈是否为空
{
return top == -1;
}
public void push(E e)//元素e进栈
{
if (top == capacity-1)//空间满时倍增容量
updatecapacity(2*top+1);
top++; //栈顶指针增加1
data[top] = e;
}
public E pop()//出栈操作
{
if (empty())
throw new IllegalArgumentException("栈空");
E e = (E)data[top];
top--;
if (capacity>initcapacity&&top+1 == capacity/4)
updatecapacity(capacity/2);
return e;
}
public E peek()//取栈顶元素操作
{
if (empty())
throw new IllegalArgumentException("栈空");
return (E)data[top];
}
}
2.链栈的存储存储及基本运算算法的实现
链栈的四要素:
-
1.栈空条件:head.next = = null。
-
2.栈满条件:只有在内存溢出的时候才会出现栈满,通常不考虑这种情况。
-
3.进栈e操作:将包含该元素的节点s插入作为首节点。
-
4.出栈操作:返回首节点值并删除该节点。
代码如下:
import java.net.PortUnreachableException;
class LinkNode<E>//链栈点泛型类
{
E data;
LinkNode<E> next;
public LinkNode()//构造方法
{
next = null;
}
public LinkNode(E d)//重载构造方法
{
data = d;
next = null;
}
}
public class LinkStackClass<E>//链栈泛型类
{
LinkNode<E>head;//存放头节点
public LinkStackClass()//构造方法
{
head = new LinkNode< E >();//创建头节点
head.next = null;//设置为空栈
}
//栈的基本运算算法
public boolean empty()//判断栈是否为空
{
return head.next== null;
}
public void push(E e)//元素e进栈
{
LinkNode<E>s = new LinkNode<E>(e);//新建结点s
s.next = head.next;//将s插入表头
head.next = s;
}
public E pop()//出栈操作
{
if (empty())
throw new IllegalArgumentException("栈空");
E e = (E)head.next.data;//取首结点值
head.next=head.next.next;
return e;
}
public E peek()//取栈顶元素操作
{
if (empty())
throw new IllegalArgumentException("栈空");
E e = (E)head.next.data;//取首结点值
return e;
}
}