#include <iostream>
#include <stdio.h>
#include <string>
using namespace std; struct DequeNode
{
int Data;
//无论是插入或者删除都需要更新prev next
DequeNode* prev;
DequeNode* next;
DequeNode() {
prev = nullptr;
next = nullptr;
Data = 0;
}
DequeNode* CreateNextNode(int val) {
DequeNode* node = new DequeNode();
node->prev = this;
this->next = node;
node->Data = val;
return node;
}
DequeNode* CreatePrevNode(int val) {
DequeNode* node = new DequeNode();
node->next = this;
this->prev = node;
node->Data = val;
return node;
}
};
//再出站的时候会导致Min不准确
class Deque
{
public:
Deque() {
head = nullptr;
tail = nullptr;
size = minVal = 0;
}
void push_back(int val)
{
if (tail == nullptr)
{
tail = new DequeNode();
tail->Data = val;
head = tail;
minVal = val;
size++;
}
else {
tail = tail->CreateNextNode(val);
/*tail->next = new DequeNode();
tail->next->Data = val;
tail->next->prev = tail;
tail = tail->next;*/
if (minVal > val)
minVal = val;
size++;
}
}
void push_front(int val)
{
if (head == nullptr)
{
head = new DequeNode();
head->Data = val;
minVal = val;
tail = head;
size++;
}
else {
head = head->CreatePrevNode(val);
//head->prev = new DequeNode();
//head->prev->Data = val;
if (minVal > val)
minVal = val;
//head->prev->next = head;
//head = head->prev;
size++;
}
}
int front()
{
if (head == nullptr)
{
return -1;
}
return head->Data;
}
int back() {
if (tail == nullptr)
{
return -1;
}
return tail->Data;
}
void pop_front()
{
if (size == 0)
{
head = tail = nullptr;
return;
}
if (head->next != nullptr)
{
DequeNode* node = head->next;
delete head;
head = node;
head->prev = nullptr;
size--;
}
}
void pop_back()
{
if (size == 0)
{
head = tail = nullptr;
return;
}
if (tail->prev != nullptr)
{
DequeNode* node = tail->prev;
delete tail;
tail = node;
tail->next = nullptr;
size--;
}
}
//从头节点直接遍历到结尾节点
int min_val() {
int min_val = head->Data;
DequeNode* node = head;
while (node != nullptr)
{
if (min_val > node->Data)
{
min_val = node->Data;
}
node = node->next;
}
return min_val;
}
int Size() { return size; }
private:
//这个是root节点
DequeNode* head;//用于后向插入
DequeNode* tail; //用于前向插入
int size;
int minVal;
};
int maind()
{
Deque s;
/*s.push_back(5);
s.push_back(6);
s.push_back(7);
s.push_back(3);
s.push_back(1);*/ s.push_front(1);
s.push_front(3);
s.push_front(7);
s.push_front(6);
s.push_front(5);
printf("deque:front:%d,back:%d,min:%d", s.front(), s.back(), s.min_val());
printf("size:%d\r\n", s.Size());
// 5 6 7 3 1
std::string line;
cout << "0 popfront 1 popback 2 front 3 back 4 min" << endl;
while (line != "exit")
{
cin >> line;
//getline(cin, line);
if (line == "0")
{
s.pop_front();
printf("deque:front:%d,back:%d,min:%d", s.front(), s.back(), s.min_val()); }
if (line == "1")
{
s.pop_back();
printf("deque:front:%d,back:%d,min:%d", s.front(), s.back(), s.min_val());
} } return 0;
}

数据结构:Deuque的更多相关文章

  1. 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)

    前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...

  2. 一起学 Java(三) 集合框架、数据结构、泛型

    一.Java 集合框架 集合框架是一个用来代表和操纵集合的统一架构.所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.接口允许集合独立操纵其代表的细节.在面向对象的语言,接口通常形成一个 ...

  3. 深入浅出Redis-redis底层数据结构(上)

    1.概述 相信使用过Redis 的各位同学都很清楚,Redis 是一个基于键值对(key-value)的分布式存储系统,与Memcached类似,却优于Memcached的一个高性能的key-valu ...

  4. 算法与数据结构(十五) 归并排序(Swift 3.0版)

    上篇博客我们主要聊了堆排序的相关内容,本篇博客,我们就来聊一下归并排序的相关内容.归并排序主要用了分治法的思想,在归并排序中,将我们需要排序的数组进行拆分,将其拆分的足够小.当拆分的数组中只有一个元素 ...

  5. 算法与数据结构(十三) 冒泡排序、插入排序、希尔排序、选择排序(Swift3.0版)

    本篇博客中的代码实现依然采用Swift3.0来实现.在前几篇博客连续的介绍了关于查找的相关内容, 大约包括线性数据结构的顺序查找.折半查找.插值查找.Fibonacci查找,还包括数结构的二叉排序树以 ...

  6. 算法与数据结构(九) 查找表的顺序查找、折半查找、插值查找以及Fibonacci查找

    今天这篇博客就聊聊几种常见的查找算法,当然本篇博客只是涉及了部分查找算法,接下来的几篇博客中都将会介绍关于查找的相关内容.本篇博客主要介绍查找表的顺序查找.折半查找.插值查找以及Fibonacci查找 ...

  7. 算法与数据结构(八) AOV网的关键路径

    上篇博客我们介绍了AOV网的拓扑序列,请参考<数据结构(七) AOV网的拓扑排序(Swift面向对象版)>.拓扑序列中包括项目的每个结点,沿着拓扑序列将项目进行下去是肯定可以将项目完成的, ...

  8. 算法与数据结构(七) AOV网的拓扑排序

    今天博客的内容依然与图有关,今天博客的主题是关于拓扑排序的.拓扑排序是基于AOV网的,关于AOV网的概念,我想引用下方这句话来介绍: AOV网:在现代化管理中,人们常用有向图来描述和分析一项工程的计划 ...

  9. 掌握javascript中的最基础数据结构-----数组

    这是一篇<数据结构与算法javascript描述>的读书笔记.主要梳理了关于数组的知识.部分内容及源码来自原作. 书中第一章介绍了如何配置javascript运行环境:javascript ...

  10. [数据结构]——链表(list)、队列(queue)和栈(stack)

    在前面几篇博文中曾经提到链表(list).队列(queue)和(stack),为了更加系统化,这里统一介绍着三种数据结构及相应实现. 1)链表 首先回想一下基本的数据类型,当需要存储多个相同类型的数据 ...

随机推荐

  1. C# 在Excel中添加、应用或删除筛选器 (日期筛选、文本筛选、数字筛选)

    自动筛选器是 Excel 中的一个基本但极其有用的功能,它可以让你根据特定的条件来自动隐藏和显示你的数据.当有大量的数据需要处理时,这个功能可以帮你快速找到你需要的信息,从未更加有效地分析和处理相关数 ...

  2. Java自增

    Java自增 本文分为以下部分: 栗子 栗子解释 来点复杂的 字节码解读 总结 栗子 java存在一种神奇的操作符,++,自增1,但是经常分不清楚 i++ 和++i 两者的区别,虽然最后结果可能都是 ...

  3. 使用 Microsoft Edge WebDriver 自动执行和测试 WebView2 应用 Selenium

    https://learn.microsoft.com/zh-cn/microsoft-edge/webview2/how-to/webdriver

  4. 一文了解JVM面试篇(上)

    Java内存区域 1.如何解释 Java 堆空间及 GC? 当通过 Java 命令启动 Java 进程的时候,会为它分配内存.内存的一部分用于创建 堆空间,当程序中创建对象的时候,就从对空间中分配内存 ...

  5. 8.16考试总结(NOIP模拟41)[你相信引力吗·marshland·party?·半夜]

    美丽的不是这个世界,而是看世界的你的眼神. T1 你相信引力吗 解题思路 好像只有我一个人没有看出来这个题是单调栈(现在一看区间问题就是双指针,线段树) 维护一个单调递减的栈. 我们把最大值放到左端点 ...

  6. 《Qt学习系列笔记》--章节索引

    Qt下载.安装及环境搭建:https://www.cnblogs.com/mrlayfolk/p/13111349.html Qt初始化代码基本说明:https://www.cnblogs.com/m ...

  7. 「C++」论高精度

    大家好,我是Charzie.在编程领域,高精度计算是一个常见的问题.当标准的整型或浮点型无法满足我们的计算需求时,高精度计算就显得尤为重要.在C++中,虽然标准库没有直接提供高精度数据类型,但我们可以 ...

  8. Github Markdown 指定图片在光亮或暗黑模式展示

    Github 根据系统配置不同的主题模式: 如果想要在光亮模式和暗黑模式显示不同的主题的图片,比如以下就是同一个图片在暗黑模式和光亮模式下展示: 解决方案 在markdon 的图片链接后添加#gh-d ...

  9. work02

    第一题: 看程序说答案 int a = 10; int b = 3; int c = a + b;//13 int d = a - b;//7 int e = a * b; //30 int f = ...

  10. 小白也能玩转Git:从入门到实战详细教程

    Git介绍 Git是一种分布式版本控制系统,它广泛应用于软件开发中.通过Git,开发人员可以追踪文件的变化.协作工作.管理代码库等.与集中式版本控制系统(如SVN)不同,Git使每个开发人员都具有完整 ...