文章目录
总结
代码
java
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.Stack;
/**
* @Author: ggdpzhk
* @CreateTime: 2024-08-01
* 622
*/
public class _013_QueueSrackAndCircularQueue {
//直接用java内部事项
//其实内部就是双向链表,常数操作慢
public static class Queue1{
public Queue<Integer> queue = new LinkedList<>();
//调用任何方法之前,先判断队列内是否有东西
public boolean isEmpty() {
return queue.isEmpty();
}
//向队列中加入num,加到尾
public void offer(int num){
queue.offer(num);
}
//从队列拿数,从头部拿
public int poll(){
return queue.poll();
}
//返回队列元素,但是不弹出
public int peek(){
return queue.peek();
}
//返回队列大小,(目前队列有几个数)
public int size(){
return queue.size();
}
}
//用数组当 队列,范围是这样的 [)
public static class Queue2{
public int[] queue;
public int l ;
public int r ;
//加入操作的总次数上限时多少一定要明确
public Queue2(int n){
queue = new int[n];
l = 0;
r = 0;
}
//调用任何方法前,先看队列是否为空
public boolean isEmpty(){
return l == r;
}
//向队列中加入num
public void offer(int num){
queue[r++] = num;//先用再++
}
//队列中弹出一个数,从头部弹出
public int poll(){
return queue[l++];
}
//返回队列元素
public int peek(){
return queue[l];
}
//返回队列大小
public int size(){
return r - l;
}
}
//栈
//直接用Java内部的实现
//其实就是动态数组,但是常数时间不好
public static class Stack1(){
public Stack<Integer> stack = new Stack<>();
//调用方法前先判空
public boolean isEmpty(){
return stack.isEmpty();
}
//进栈
public void push(int num){
stack.push(num);
}
//出栈
public int pop(){
return stack.pop();
}
//返回栈顶元素但是不弹出
public int peek(){
return stack.peek();
}
public int size(){
return stack.size();
}
}
//用数组来当栈 [)
/*实际刷题时更常见的写法,常数时间好,
* 如果可以确定 加入 操作 的总次数不超过n,那么可以用
* 一般笔试、面试都会有一个明确的数据量,所以这是最常用的方式*/
public static class Stack2{
public int[] stack;
public int size;
public Stack2(int n){
stack = new int[n];
size = 0;
}
public boolean isEmpty(){
return size == 0;
}
public void push(int num){
stack[size++] = num;
}
public int pop(){
return stack[--size];
}
//寻找栈顶元素,但是不出栈。栈底元素就是size[0]
public int peek(){
return stack[size-1];
}
public int size(){
return size;
}
}
//循环设计队列
class MyCircularQueue{
public int[] queue;
public int l, r, size, limit;
//方法,新建一个循环队列(用数组的形式)
//同时在队列里的数字个数不要超过k
public MyCircularQueue(int k){
queue = new int[k];
l = r = size = 0;
limit = k;
}
public boolean isEmpty(){
return size == 0;
}
public boolean isFull(){
return size == limit;
}
public boolean enQueue(int num){
//如果队列满了,什么也不做,返回false
//如果队列没满,就加入value,返回true
if(isFull()){
return false;
}else{
queue[r] = num;
r = r == limit - 1 ? 0 : (r + 1);//这个比取模要好懂
size++;
return true;
}
}
public boolean deQueue(){
if(isEmpty()){
return false;
}else{
l = l == limit - 1 ? 0 : (l + 1);
size--;
return true;
}
}
//返回队列头部数字
public int Front(){
if(isEmpty()){
return -1;
}else {
return queue[l];
}
}
//返回尾部数字
public int Rear(){
if(isEmpty()){
return -1;
}else{
/*新加入的数字是放在r位置上的
* 并且是循环队列
* 所以 队尾的位置就应该在r-1 或者 limit-1 的位置*/
int last = r == 0 ? (limit-1) : (r - 1);//不太好表示,所以引入last
return queue[last];
}
}
}
}