今天说一下栈和队列的实现……
一、栈的基本概念与操作:
栈是一种特殊的线性表,只允许在一端实现插入删除的操作,插入删除的一端称之为栈顶,另一端称为栈底。栈遵循后进先出的原则。
压栈:指栈的插入操作,入数据在栈顶。
出栈:又叫弹栈,指栈的出数据操作,出数据在栈顶。
其基本操作的实现图……
如图,栈的存储方式和数组类似,所以较为简单。因此,我们只需用到数组就可以解决问题。
第一步:创建一个数组
public class MyStack {
int[] array;
int size = 0;
public MyStack(){
this.array = new int[10];
}
}
第二步:压栈操作
注意:压栈操作我们需要考虑一个问题,栈是否已
//定义一个方法判断栈是否已满
public boolean isFull()
{
return size == array.length;
}
接下来进行操作:
public int push (int val){
//如果是满的要扩容
if(isFull()){
array = Arrays.copyOf(array,2*array.length);
}
this.array[size] = val;
size++;
return val;
}
第三步:出栈操作
注意:这里需要判断值是否为空的情况,可以创建一个异常类来报错
public class MyEmptyStackException extends RuntimeException{
public MyEmptyStackException() {
}
public MyEmptyStackException(String message) {
super(message);
}
}
操作的实现:
public int pop() {
//判断元素是否为空
if(empty()){
throw new MyEmptyStackException("栈为空!");
}
//直接将栈首的元素记录输出即可
int set = array[size-1];
size--;
return set;
}
队列的基本概念
队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出的原则。
入队列:进行插入操作的一端称为队尾
出队列:进行删除操作的一端称为队头
第一步:操作前准备
在这里实现相关操作我们用单链表的方法实现,我们可以定义两个变量分别指向队头和队尾,代码如下:
static class ListNode{
public int val;
public ListNode next;
public ListNode(int val){
this.val = val;
}
}
//定义头尾结点
public ListNode head;
public ListNode tail;
//定义一个计数变量
public int size;
第二步:判断队列是否为空
public boolean empty()
{
return size == 0;
}
实现入队的操作:
public void offer(int val){
ListNode node = new ListNode(val);
//如果队列为空时
if(empty()){
head = node;
tail = node;
}else{
tail.next = node;
tail = tail.next;
}
size++;
}
实现出队的操作:
public int poll()
{
if(empty())
{
return -1;
}
//定义一个参数存放头结点的值
int ret = head.val;
head = head.next;
if(head == null){
tail = null;
}
size--;
return ret;
}
希望对你的数据结构有帮助……