一.栈
1.1 栈的概念
栈就是一种特殊的线性表,只允许固定的一端进行插入和删除元素的操作,进行数据的插入删除操作的一端称为栈顶,另一端称为栈底 栈中的数据元素遵守 后进先出 LIFO的原则
压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶
出栈:栈的删除操作叫做出栈,出数据在栈顶
1.2 实现
用顺序表实现栈
public class MyStack {
private int[] arr = new int[100];
private int size = 0;
public void push(int v){
arr[size++] = v;
}
public int pop(){
return arr[size--];
}
public int peek(){
return arr[size];
}
public boolean isEmpty(){
return size == 0 ? true:false;
}
public int size(){
return size;
}
}
二.队列
2.1 队列的概念
队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有 先进先出 FIFO
入队列:进行插入操作的一端称为队尾
出队列:进行删除操作的一端称为对头
2.2 实现
用链表实现队列
class ListNode{
public int val;
public ListNode next;
public ListNode(int val){
this.val = val;
}
}
public class MyQueue {
public ListNode head;
public ListNode fail;
public int size;
public void offer(int x){
ListNode node = new ListNode(x);
if(this.fail == null){
this.head = node;
this.fail = node;
}else {
this.fail.next = node;
this.fail = node;
}
size++;
}
public int poll(){
if(size == 0){
throw new RuntimeException("队列为空");
}
ListNode node = this.head;
this.head = this.head.next;
if(this.head == null){
this.fail = null;
}
size--;
return node.val;
}
public int peek(){
if(size == 0){
throw new RuntimeException("队列为空");
}
ListNode node = this.head;
return node.val;
}
public boolean isEmpty(){
return size == 0;
}
public int size(){
return size;
}
}
2.3 循环队列
将1 和 2 入队列后:
区分循环队列空和队列满?
1.少用一个存储位置‘
2.设置一个标记 flag
3.计数,count记录队列中有效元素的个数
1.少用一个存储位置
判空条件:front == rear
判满条件:(rear+1) % capacity == front
2.设置一个标记 flag
入队列:在rear位置尾插一个,将flg = true
出队列:front往后移动,将flg = false
判空:front = rear && flg = false
判满:front = rear && flg = true
3.计数,count记录队列中有效元素的个数
入队列:在rear位置尾插一个,将count++
出队列:front往后移动,将count–
判空:count == 0
判满:count == capacity