双向链表实现队列

双向链表的结点包含前驱指针和后继指针,队列入队操作是在双向链表尾部添加元素,队列的出队操作是把双向链表的头结点删除,判断队列是否为空只要判断双向链表的头指针是否指向了NULL即可。

# include <iostream>
# include <cstdlib>
using namespace std;

struct queueNode
{
	int val;
	queueNode *pre;
	queueNode *next;
	queueNode(int x):val(x),pre(NULL),next(NULL){}
};

queueNode *head=NULL;
queueNode *tail=NULL;
queueNode *cur=head;
void push(int x)   //入队
{
if(head==NULL)
{
head=new queueNode(x);
cur=head;
tail=head;
}
else
{
queueNode *tmp=new queueNode(x);
cur->next=tmp;
tmp->pre=cur;
cur=tmp;
tail=cur;
}
}

bool isempty(queueNode *head)  //判断队列是否为空
{
return head==NULL;
}
void pop()    //出队
{
	if(tail==NULL)
		return ;
	queueNode *tmp=head;
	head=head->next;
	if(head)
	head->pre=NULL;
	delete tmp;
}

int front(queueNode *head)  //返回队头元素
{
if(isempty(head))
	return -1;
return head->val;
}

int main()
{
	push(1);
	push(2);
	push(3);
	cout<<front(head)<<endl;
	pop();
	cout<<isempty(head)<<endl;
system("pause");
return 0;
}

双向链表实现队列

时间: 2024-10-08 22:06:40

双向链表实现队列的相关文章

模板(双向链表与队列)

"双向链表与队列" "双向链表"是包含两个指针域,一个数据域,既有指向前驱的指针,还有指向后继的指针,同时可以从两个方向对链表进行遍历,访问各个节点."双向链表"较"单链表"在插入和删除节点方面更为简单,但是所占的空间比"单链表"大."队列"的实现之所以选择使用双向链表,是因为队列的特点是"先进先出",如若使用顺序表则很大程度上的浪费空间.在这样的情境下,链表较顺序表

双向链表实现队列与循环链表

一.双向链表(double linked list)如图26.5,是在单链表的每个结点中,再设置一个指向其前驱结点的指针域.双向链表的基本操作与单链表基本一样,除了插入和删除的时候需要更改两个指针变量,需要注意的是修改的顺序很重要,插入如图3-14-5,删除如图3-14-6. 链表的delete操作需要首先找到要摘除的节点的前趋,而在单链表中找某个节点的前趋需要从表头开始依次查找,对于n个节点的链表,删除操作的时间复杂度为O(n).可以想像得到,如果每个节点再维护一个指向前趋的指针,删除操作就像

双端队列篇deque SDUT OJ 双向队列

双向队列 Time Limit: 1000MS Memory limit: 65536K 题目描述 想想双向链表……双向队列的定义差不多,也就是说一个队列的队尾同时也是队首:两头都可以做出队,入队的操作. 现在给你一系列的操作,请输出最后队列的状态: 命令格式: LIN X  X表示一个整数,命令代表左边进队操作: RIN X  表示右边进队操作: ROUT LOUT   表示出队操作: 输入 第一行包含一个整数M(M<=10000),表示有M个操作: 以下M行每行包含一条命令: 命令可能不合法

双向队列(STL做法)

双向队列 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 想想双向链表--双向队列的定义差不多,也就是说一个队列的队尾同时也是队首:两头都可以做出队,入队的操作. 现在给你一系列的操作,请输出最后队列的状态: 命令格式: LIN X  X表示一个整数,命令代表左边进队操作: RIN X  表示右边进队操作: ROUT LOUT   表示出队操作: 输入 第一行包含一个整数M(M<=10000),表示有M个操作: 以下M行每行包

双向队列 (STL)

双向队列 Time Limit: 1000MS Memory limit: 65536K 题目描述 想想双向链表……双向队列的定义差不多,也就是说一个队列的队尾同时也是队首:两头都可以做出队,入队的操作.现在给你一系列的操作,请输出最后队列的状态:命令格式:LIN X  X表示一个整数,命令代表左边进队操作:RIN X  表示右边进队操作:ROUTLOUT   表示出队操作: 输入 第一行包含一个整数M(M<=10000),表示有M个操作:以下M行每行包含一条命令:命令可能不合法,对于不合法的命

SDUT 1466 双向队列

双向队列 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 想想双向链表……双向队列的定义差不多,也就是说一个队列的队尾同时也是队首:两头都可以做出队,入队的操作.现在给你一系列的操作,请输出最后队列的状态:命令格式:LIN X  X表示一个整数,命令代表左边进队操作:RIN X  表示右边进队操作:ROUTLOUT   表示出队操作: Input 第一行包含一个整数M(M<=10000),表示有M个操作:以下M行每行

swift实现线程安全的栈和队列

实现一个线程安全的栈 这里使用数组来存储栈的数据.不足之处在于本例中的Stack可以无限扩容,更好的是初始化时候指定一个最大容量,防止不断扩容申请内存导致内存不够的问题.这里的线程安全使用一个串行队列来保证,实际上也可以通过加锁或者信号量甚至自旋锁来解决. struct Stack<Element> { private var items: [Element] private var queue = DispatchQueue(label: "StackOperationQueue&

省选必知

简单列了一点 1.1 基本数据结构 1. 数组 2. 链表,双向链表 3. 队列,单调队列,双端队列 4. 栈,单调栈 1.2 中级数据结构 1. 堆 2. 并查集与带权并查集 3. hash 表 自然溢出 双hash 1.3 高级数据结构 1. 树状数组 2. 线段树,线段树合并 3. 平衡树 Treap 随机平衡二叉树 Splay 伸展树 * Scapegoat Tree 替罪羊树 4. 块状数组,块状链表 5.* 树套树 线段树套线段树 线段树套平衡树 * 平衡树套线段树 6.可并堆 左偏

[libevent]Libevent介绍与编译

libevent介绍 libevent是一个轻量级的,开源高性能的,基于事件触发的网络库,适用于windows.linux.bsd等多种平台,内部使用select.epoll.kqueue等系统调用管理事件机制. 编译库代码,编译脚本会判断OS支持哪种类型的事件机制(select.epoll或kqueue),然后条件编译相应代码,供上层使用的接口仍然是保持统一的. 有许多开源项目使用libevent,例如memcached.使用libevent,使得memcached可以适应多种操作系统.Lib