队列其实很简单

我们知道队列是一个非常常用的底层数据结构
他具有先进先出(FIFO)的特性
而和他很亲近的栈具有先进后出的特性

当然我们知道栈和队列都可以利用数组和链表实现特性
我们今天来考虑两个事情:
1、使用数组实现循环队列结构
2、使用双栈实现队列结构

使用数组实现循环队列结构

一个队列的状态
在这里插入图片描述
在这里插入图片描述

  1. 插入节点的时候向end指针指向的位置插入节点,然后end向后移动
  2. 出队的时候将head 指针指向的位置的数据出队,head指针后移
  3. 当head等于end的时候队列为空
  4. 当添加元素end后移之后,与head相等,说明队列已满这时候需要扩容
  5. 上述的向后移动都不是单纯的,而是加一然后对数组长度进行除余
public class RoundQue<T> {
    private T[] dataBase = (T[])new Object[10];
    private int head = 0;
    private int end = 0;
    public void add(T t){
        System.out.println("head:"+head+"   数据:"+t);
        dataBase[head] = t;
        head = (head+1)%dataBase.length;
        if(head == end){
            System.out.println("队列满为空,当前的长度是"+dataBase.length);
            T[] dataBase1 = (T[])new Object[dataBase.length*2];
            int e = end;
            for(int i = 0; i < dataBase.length ; i++){
                dataBase1[e+i] = dataBase[end];
                end = (end+1)%dataBase.length;
            }
            head += (dataBase.length);
            dataBase = dataBase1;
        }
    }
    public T get(){
        System.out.println("当前head为"+head+"当前end为"+end);
        if(head == end){
            System.out.println("队列为空");
            return null;
        }
        T t = dataBase[end];
        dataBase[end] = null;
        end = (end+1)%dataBase.length;
        return t;
    }
}

使用双栈实现队列结构

是不是很奇葩
用栈实现队列可能会更加的麻烦,用两个栈无形中增加了空间负责度
不过两个栈中一个出队栈、一个入队栈,分开操作,不会相互影响更加安全

在这里插入图片描述

  1. 初始的两个空的栈
  2. 添加数据(入队)直接进入 入队栈
  3. 如果现在要进行出队 ,从 出队栈 中出栈,入过当前栈为空,则将入队栈中的数据全部出队依次放入入队栈(这样在入队栈中是倒序的,到了出队栈就成了顺序)
public class TwoStackForQue<T> {

    private Stack<T> stackout = new Stack<T>();
    private Stack<T> stackin = new Stack<T>();
    private int count;

    public void add(T t){
        if(t!=null) {
            stackin.add(t);
        }else{
            System.out.println("插入值为空,对不起不能插入");
        }
    }
 
    public T pop() {
        if(stackout.isEmpty()&&!stackin.isEmpty()){
            while(!stackin.isEmpty()){
                stackout.add(stackin.pop());
            }
        }
        return stackout.pop();
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
队列是一种数据结构,它遵循先进先出(FIFO)的原则。这意味着新添加到队列中的元素总是被放在队列的末尾,而从队列中移除的元素总是最早进入队列的元素。 在C语言中,可以使用数组和指针来实现队列。以下是一个简单队列实现示例: ```c #include <stdio.h> #include <stdlib.h> #define MAX_SIZE 10 typedef struct { int data[MAX_SIZE]; int front; int rear; } Queue; void initQueue(Queue *q) { q->front = -1; q->rear = -1; } int isQueueEmpty(Queue *q) { return (q->front == -1 && q->rear == -1); } int isQueueFull(Queue *q) { return (q->rear == MAX_SIZE - 1); } void enqueue(Queue *q, int value) { if (isQueueFull(q)) { printf("Queue is full\n"); return; } if (q->front == -1) { q->front = 0; } q->rear++; q->data[q->rear] = value; } int dequeue(Queue *q) { if (isQueueEmpty(q)) { printf("Queue is empty\n"); return -1; } int value = q->data[q->front]; q->front++; return value; } void printQueue(Queue *q) { if (isQueueEmpty(q)) { printf("Queue is empty\n"); return; } printf("Queue elements: "); for (int i = q->front; i < q->rear + 1; i++) { printf("%d ", q->data[i]); } printf("\n"); } ``` 这个队列实现包括以下功能: * `initQueue`:初始化队列,设置队首和队尾为-1表示队列为空。 * `isQueueEmpty`:检查队列是否为空。如果队首和队尾都为-1,则队列为空。 * `isQueueFull`:检查队列是否已满。如果队尾的下一个位置等于数组的最大索引减1,则队列已满。 * `enqueue`:将元素添加到队列的末尾。如果队列已满,则打印错误消息并返回。否则,将新元素添加到队尾,并更新队尾的位置。 * `dequeue`:从队列的开头移除一个元素并返回它。如果队列为空,则打印错误消息并返回-1。否则,返回并删除队首的元素,并更新队首的位置。 * `printQueue`:打印队列中的所有元素。如果队列为空,则打印错误消息并返回。否则,遍历队列并打印每个元素。 这个简单队列实现可以用于各种应用,例如模拟程序中的任务调度、实现先进先出算法等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值