IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 队列练习之Example003-如果允许在循环队列的两端都可以进行插入和删除操作,分别写出从队尾删除和从队头插入的算法 -> 正文阅读

[数据结构与算法]队列练习之Example003-如果允许在循环队列的两端都可以进行插入和删除操作,分别写出从队尾删除和从队头插入的算法

Example003

题目

如果允许在循环队列的两端都可以进行插入和删除操作,要求:

  • 写出循环队列的类型定义。
  • 分别写出从队尾删除和从队头插入的算法。

分析

本题实际考查的是双端队列的代码实现。具体可参考:双端队列

注意:

  • 约定队头指针指向队头元素;队尾指针指向队尾元素的下一位置。
  • 有些书中给出的代码实现,是约定的队头指针指向队头元素的前一位置,队尾指针指向队尾元素,具体根据实际情况来即可。

图解

略。

C实现

核心代码:

/**
 * 双端队列结构体定义,跟循环队列的一样,只是 rear 在双端队列中名为 back
 */
typedef struct {
    /**
     * 数据域,存储循环队列中的数据
     */
    int data[MAXSIZE];
    /**
     * 指针域,存储循环队列中队头元素的位置
     */
    int front;
    /**
     * 指针域,存储循环队列中队尾元素的位置
     */
    int back;
} DoubleEndedQueue;

/**
 * 从队头将元素入队
 * @param queue 双端队列
 * @param ele 待入队的元素
 * @return 如果队列已满则不能入队返回 0 表示入队失败;否则返回 1 表示入队成功
 */
int pushFront(DoubleEndedQueue *deque, int ele) {
    // 0.参数校验,如果队满则不能入队
    if (isFull(*deque)) {
        return 0;
    }

    // 1.将元素插入到队列的头部
    // 1.1 由于队头指针指向队列的队头元素,所以先修改队头指针。新元素应该插入到原队头元素的前面,所以要队头指针减一,因为是循环队列,所以要对 MAXSIZE 取余
    deque->front = (deque->front - 1 + MAXSIZE) % MAXSIZE;
    // 1.2 再对队头指针所指向的位置进行赋值
    deque->data[deque->front] = ele;
    // 1.3 返回 1 表示入队成功
    return 1;
}

/**
 * 从队尾将元素出队
 * @param deque 双端队列
 * @param ele 用来保存出队元素
 * @return 如果队空则返回 0 表示出队失败,否则返回 1 表示出队成功
 */
int popBack(DoubleEndedQueue *deque, int *ele) {
    // 0.参数校验,如果队空则不能出队
    if (isEmpty(*deque)) {
        return 0;
    }
    // 1.从队尾将元素出队
    // 1.1 由于队尾指针指向队尾元素的下一个位置,所以先修改队尾指针,将其减一,但由于是循环队列,所以要对 MAXSIZE 取余
    deque->back = (deque->back - 1 + MAXSIZE) % MAXSIZE;
    // 1.2 然后取出当前队尾指针所指向的元素,就是待出队的元素
    *ele = deque->data[deque->back];
    // 1.3 返回 1 表示出队成功
    return 1;
}

完整代码请参考:DoubleEndedQueue.c

Java实现

核心代码:

public class DoubleEndedQueue {

    /**
     * 声明一个双端队列(顺序存储的双端队列)
     */
    private Queue deque;

    /**
     * 从队头将元素入队
     *
     * @param ele 待入队的元素
     *
     * @throws Exception 如果队列已满则抛出此异常
     */
    public void pushFront(int ele) throws Exception {
        // 0.参数校验,如果队满则不能入队
        if (isFull()) {
            throw new Exception("队满则不能入队!");
        }
        // 1.将元素插入到队列的头部
        // 1.1 由于队头指针指向队列的队头元素,所以先修改队头指针。新元素应该插入到原队头元素的前面,所以要队头指针减一,因为是循环队列,所以要对 MAXSIZE 取余
        deque.front = (deque.front - 1 + MAXSIZE) % MAXSIZE;
        // 1.2 再对队头指针所指向的位置进行赋值
        deque.data[deque.front] = ele;
    }

    /**
     * 从队尾将元素出队
     *
     * @return 出队元素
     *
     * @throws Exception 如果队空则抛出此异常
     */
    public int popBack() throws Exception {
        // 0.参数校验,如果队空则不能出队
        if (isEmpty()) {
            throw new Exception("队空则不能出队!");
        }

        // 1.从队尾将元素出队
        // 1.1 由于队尾指针指向队尾元素的下一个位置,所以先修改队尾指针,将其减一,但由于是循环队列,所以要对 MAXSIZE 取余
        deque.back = (deque.back - 1 + MAXSIZE) % MAXSIZE;
        // 1.2 然后取出当前队尾指针所指向的元素,就是待出队的元素
        return deque.data[deque.back];
    }
}

/**
 * 双端队列定义,跟循环队列的一样,只是 rear 在双端队列中名为 back
 */
class Queue {
    /**
     * 数据域,存储循环队列中的数据
     */
    int[] data;
    /**
     * 指针域,存储循环队列中队头元素的位置
     */
    int front;
    /**
     * 指针域,存储循环队列中队尾元素的位置
     */
    int back;
}

完整代码请参考:DoubleEndedQueue.java

测试代码请参考:DoubleEndedQueueTest.java

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-05-10 12:08:32  更:2022-05-10 12:08:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 3:21:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码