一:栈(Stack)
1 概念
栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
出栈:栈的删除操作叫做出栈。出数据在栈顶。
2.实现
相对来说,顺序表的实现上要更为简单一些,这里我们优先用顺序表实现栈。
public class MyStack
{ //不考虑扩容问题
private int[] array = new int[100];
private int size = 0;
public void push(int v)
{
array[size++] = v;
}
public int pop()
{
return array[--size];
}
public int peek()
{
return array[size - 1];
}
public boolean isEmpty()
{
return size == 0;
}
public int size()
{
return size;
}
}`
二:队列(Queue)
1 概念
队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(FirstIn First Out) 入队列:进行插入操作的一端称为队尾(Tail/Rear) 出队列:进行删除操作的一端称为队头(Head/Front)
2.实现
队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低。
class Node
{
int val;
Node next;
Node(int val, Node next)
{
this.val = val;
this.next = next;
}
Node(int val)
{
this(val, null);
}
}
public class MyQueue
{
private Node head = null;
private Node tail = null;
private int size = 0;
public void offer(int v)
{
Node node = new Node(v, head);
if (tail == null)
{
tail = head;
}
size++;
}
public int poll()
{
if (size == 0)
{
throw new RuntimeException("队列为空");
}
Node oldHead = head;
head = head.next;
if (head == null)
{ tail = null;
}
size--;
return oldHead.val;
}
public int peek()
{
if (size == 0)
{
throw new RuntimeException("队列为空");
}
return head.val;
}
public boolean isEmpty()
{
return size == 0;
}
public int size()
{
return size;
}
}
实际中我们还可能遇到循坏队列:
数组下标循坏的小技巧:
1.1. 下标最后再往后(offset 小于 array.length): index = (index + offset) % array.length
双端队列 (Deque)
概念
双端队列(deque)是指允许两端都可以进行入队和出队操作的队列,deque 是 “double ended queue” 的简称。
那就说明元素可以从队头出队和入队,也可以从队尾出队和入队。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。