习题3.26双端队列

#include<stdio.h>
#include<stdlib.h>

struct Node;
struct Queue;

typedef struct Node * PtrToNode;
typedef struct Queue * PtrToQ; 

struct Node{
    PtrToNode Pre;
    PtrToNode Next;
    ElemenType Ele;
}

struct Queue{
    PtrToNode front;
    PtrToNode rear;
};

PtrToQ
CreateDQ( void )
{
    PtrToQ Q;
    Q = malloc( sizeof( struct Queue ) );

    Q->front = malloc( sizeof( struct Node ) );
    Q->front->pre = NULL;

    Q->rear = malloc( sizeof( struct Node ) );
    Q->rear->Next = NULL;

    Q->front->Next = Q->rear;
    Q->rear->Pre = Q->front;
    return Q;
}

void
Push( ElementType X, PtrToQ Q )
{
    PtrToNode TmpCell;
    TmpCell = malloc( sizeof( struct Node ) );
    /* 连接后面 */
    TmpCell->Next = Q->front->Next;
    TmpCell->Next->pre = TmpCell;
    /* 连接前面 */
    Q->front->Next = TmpCell;
    TmpCell->pre = Q->front;
}

ElementType
Pop( PtrToQ Q )
{
    PtrToNode TmpCell;
    ElementType res;
    if( !IsEmpty() )
    {
        TmpCell = Q->front->Next;
        Q->front->Next = TmpCell->Next;
        TmpCell->Next->pre = Q->front;
        res = TmpCell->Ele;
        free( TmpCell );
        return res;
    }
    else
        Error;
}

void
Inject( ElementType X, PtrToQ Q )
{
    PtrToNode TmpCell;
    TmpCell->Ele = X;
    /* 左边 */
    TmpCell->pre = Q->rear->pre;
    TmpCell->pre->Next = TmpCell;
    /* 右边 */
    TmpCell->Next = Q->rear;
    Q->rear->pre = Tmpcell;
}

ElementType
Eject( PtrToQ Q )
{
    if( !IsEmpty( Q ) ){
    PtrToNode TmpCell;
    ElementType res;
    TmpCell = Q->rear->pre;
    TmpCell->pre->Next = Q->rear;
    Q->rear->pre = TmpCell->pre;
    res = TmpCell->Ele;
    free(TmpCell);
    return res;
    }
    else
        Error;
}

以上使用链表做两端都可以插入删除元素的双端队列

初始状态为两个表头的双链表

IsEmpty:判断队列是否只有两个结点

时间: 2024-07-28 12:52:56

习题3.26双端队列的相关文章

数据结构与算法分析 3.26 — 双端队列的实现

一.题目 编写支持双端队列的例程,插入与弹出操作均花费 O(1)时间 二.解答 双端队列(deque,全名double-ended queue)是一种具有队列和栈性质的数据结构. 双端队列中的元素可以从两端弹出,插入和删除操作限定在队列的两边进行. 基本操作:在双端队列两端插入与删除. ADT术语: Capacity:数组容量 Left:队列左端,指向队列左边第一个元素 Right:队列右端,指向队列右边最后一个元素的下一个位置 初始化:Left = Right = 0: 判空:   Left

【Weiss】【第03章】练习3.26:双端队列

[练习3.26] 双端队列(deque)是由一些项的表组成的数据结构,对该数据结构可以进行下列操作: Push(X,D):将项X插入到双端队列D的前端. Pop(D):从双端队列D中删除前端项并返回. Inject(X,D):将项X插入到双端队列D的尾端. Eject(D):从双端队列D中删除尾端项并返回. 编写支持双端队列的例程,每种操作均花费O(1)时间. Answer: 相当简单的题目,把改一改双向链表就可以了. 测试代码: 1 #include <iostream> 2 #includ

Vijos1834 NOI2005 瑰丽华尔兹 动态规划 单调双端队列优化

设dp[t][x][y]表示处理完前t个时间段,钢琴停留在(x,y)处,最多可以走多少个格子 转移时只需逆着当前倾斜的方向统计len个格子(len为时间区间的长度,len=t-s+1),如果遇到障碍就中断 转移过程可以用单调非递增的双端队列优化 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 5 const int maxN=202; 6 const int inf=0x3f3f3f3f

两个栈实现双端队列

一个笔试题,当时竟然没想出来,现在实现下 1 /* 2 用两个栈实现双端队列 3 栈s1,s2. 4 pushback()和popback(),必须在s2为空的情况,把s2的都放s1中 5 pushfront()和popfront(),必须是在s1为空,把s1的都给放到s2中 6 */ 7 #include <iostream> 8 #include <stack> 9 using namespace std; 10 template <typename T> 11 c

URAL 2026 Dean and Schedule 贪心、双端队列(deque)、队列(queue)

C - Dean and Schedule Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Practice URAL 2026 Description A new academic year approaches, and the dean must make a schedule of classes for first-year students. Ther

STL容器:deque双端队列学习

所谓deque,是"double-ended queue"的缩写; 它是一种动态数组形式,可以向两端发展,在尾部和头部插入元素非常迅速; 在中间插入元素比较费时,因为需要移动其它元素;(No) 双端队列容器,在序列的两端放置和删除元素是高效的; 而vector只是在序列末尾插入才是高效的. C++ Code 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495

【deque】滑动窗口、双端队列解决数组问题

C++手册之deque 所属头文件 <deque> 常用操作: back()返回尾部元素: front()返回头部元素: push_back()尾部插入元素: pop_bakc()尾部删除元素: push_front()头部插入元素: pop_front()头部删除元素: 问题1:求滑动窗口的最大值(<剑指offer面试题65>) 描述:给定一个数组和滑动窗口的大小,找出所有滑动窗口里的最大值. 示例:数组{2, 3, 4, 2, 6, 2, 5} 窗口大小为 3,一共有7-3+1

经典算法题每日演练——第十九题 双端队列

原文:经典算法题每日演练--第十九题 双端队列 话说大学的时候老师说妹子比工作重要~,工作可以再换,妹子这个...所以...这两个月也就一直忙着Fall in love,嗨,慢慢调整心态吧, 这篇就选一个简单的数据结构聊一聊,话说有很多数据结构都在玩组合拳,比如说:块状链表,块状数组,当然还有本篇的双端队列,是的,它就是 栈和队列的组合体. 一:概念 我们知道普通队列是限制级的一端进,另一端出的FIFO形式,栈是一端进出的LIFO形式,而双端队列就没有这样的限制级,也就是我们可以在 队列两端进行

UVa 210 Concurrency Simulator(双端队列)

题意  模拟程序并行运行 STL队列 双端队列 的应用  用双端队列维护即将执行的程序  再用个队列维护等待变量释放的程序   用lock表示变量锁定状态 先将所有程序依次放到执行队列中  每次取出队首程序运行不超过lim时间  未运行完又放到执行队列队尾 遇到lock时  若当前锁定状态为false就将锁定状态变为true  否则将当前程序放到等待队列队尾并结束运行 遇到unlock时  若等待队列有程序  就将等待队列队首程序放到执行队列队首 遇到end时 退出当前执行(不再进队尾) #in