双端队列 ADT接口 链表实现

Deque ADT接口 DEQUEUE.h:

 1 #include <stdlib.h>
 2 #include "Item.h"
 3
 4 typedef struct DEQUEUEnode *link;
 5 struct DEQUEUEnode
 6 {
 7     Item item;
 8     link next;
 9     link last;
10 };
11
12 void DEQUEUEinit(int);
13 void DEQUEUEerror(void);
14 Item DEQUEUEheadget(void);
15 Item DEQUEUEtailget(void);
16 void DEQUEUEheadput(Item);
17 void DEQUEUEtailput(Item);
18 int DEQUEUEisEmpty(void);
19 int DEQUEUEisFull(void);

Deque ADT接口实现 DEQUEUE.c:

 1 static link head,tail;
 2 static int N; //备用
 3
 4 void DEQUEUEinit(int maxN)
 5 {
 6     head=malloc(sizeof(*head));
 7     tail=head;
 8     tail->next=NULL;
 9     tail->last=NULL;
10     head->next=NULL;
11     head->last=NULL;
12     N=maxN;
13 }
14 void DEQUEUEerror(void)
15 {
16     printf("节点为空或节点已满");
17     exit(1);
18 }
19 Item DEQUEUEheadget(void)
20 {
21     Item temp;
22     temp=head->item;
23     head=head->next;
24     free(head->last);
25     head->last=NULL;
26     return temp;
27 }
28 Item DEQUEUEtailget(void)
29 {
30     Item temp;
31     tail=tail->last;
32     temp=tail->item;
33     free(tail->next);
34     tail->next=NULL;
35     return temp;
36 }
37 void DEQUEUEheadput(Item value)
38 {
39     head->last=malloc(sizeof(*head));
40     if(DEQUEUEisFull())
41         DEQUEUEerror();
42     head->last->next=head;
43     head=head->last;
44     head->item=value;
45     head->last=NULL;
46 }
47 void DEQUEUEtailput(Item value)
48 {
49     tail->item=value;
50     tail->next=malloc(sizeof(*head));
51     if(DEQUEUEisFull())
52         DEQUEUEerror();
53     tail->next->last=tail;
54     tail=tail->next;
55     tail->next=NULL;
56 }
57 int DEQUEUEisEmpty(void)
58 {
59     if(head==NULL&&tail==NULL)
60         return 1;
61     return 0;
62 }
63 int DEQUEUEisFull(void)
64 {
65     if((head==NULL&&tail!=NULL)||(head!=NULL&&tail==NULL))
66         return 1;
67     return 0;
68 }

Item.h:

1 typedef char Item;

主程序 main.c:

 1 #include <stdio.h>
 2
 3 int main(void)
 4 {
 5     int N;
 6
 7     printf("输入需要申请内存大小:");
 8     if(scanf("%d", &N))
 9         DEQUEUEinit(N);
10     else
11         DEQUEUEerror();
12     getchar();
13     printf("输入%d个字符",N);
14     printf("(‘+‘从队头get ‘*‘从队尾get ‘大写字母‘"
15               "从队头put ‘小写字母‘从队尾put):\n");
16
17     while((N=getchar())!=‘\n‘)
18     {
19         switch(N)
20         {
21             case ‘+‘:
22                 putchar(DEQUEUEheadget());
23                 break;
24             case ‘*‘:
25                 putchar(DEQUEUEtailget());
26                 break;
27             default:
28                 if(N>64&&N<91)
29                     DEQUEUEheadput(N);
30                 else
31                     DEQUEUEtailput(N);
32         }
33     }
34
35     return 0;
36 }

原文地址:https://www.cnblogs.com/WALLACE-S-BOOK/p/8983908.html

时间: 2024-10-14 08:52:21

双端队列 ADT接口 链表实现的相关文章

习题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; }; Ptr

HDU 4286 Data Handler (双端队列)

Data Handler Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2455    Accepted Submission(s): 616 Problem Description You are in charge of data in a company, so you are called "Data Handler&qu

数据结构与算法分析 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

std::deque双端队列介绍

在建立vector容器时,一般来说伴随这建立空间->填充数据->重建更大空间->复制原空间数据->删除原空间->添加新数据,如此反复,保证vector始终是一块独立的连续内存空间:在建立deque容器时,一般便随着建立空间->建立数据->建立新空间->填充新数据,如此反复,没有原空间数据的复制和删除过程,是由多个连续的内存空间组成的. C++ STL容器deque和vector很类似,也是采用动态数组来管理元素. 与vector不同的是deque的动态数组首

每日一题15:双端队列与自调整表

双端队列是一种插入和删除可以既可以在表头也可以表尾进行的一种数据结构,四种基本操作分别为: push:在表头插入 pop:在表头删除 insert:在表尾插入 eject:在表尾删除 每一种操作的复杂度都为O(1).通过组合不同插入和删除,双端队列可以作为栈使用,也可以作为队列使用: #include "stdafx.h" #include <iostream> using namespace std; struct deque_node { int val; deque_

【C/C++学院】0828-STL入门与简介/STL容器概念/容器迭代器仿函数算法STL概念例子/栈队列双端队列优先队列/数据结构堆的概念/红黑树容器

STL入门与简介 #include<iostream> #include <vector>//容器 #include<array>//数组 #include <algorithm>//算法 using namespace std; //实现一个类模板,专门实现打印的功能 template<class T> //类模板实现了方法 class myvectorprint { public: void operator ()(const T &

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

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

Java队列Queue、双端队列Deque

http://uule.iteye.com/blog/2095650?utm_source=tuicool 注意:这都只是接口而已 1.Queue API 在java5中新增加了java.util.Queue接口,用以支持队列的常见操作.该接口扩展了java.util.Collection接口. Java代码   public interface Queue<E> extends Collection<E> 除了基本的 Collection 操作外,队列还提供其他的插入.提取和检查