博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
3.4 双端队列
阅读量:5782 次
发布时间:2019-06-18

本文共 3501 字,大约阅读时间需要 11 分钟。

#include 
#include
#define ERROR 1e5typedef struct Node { int Element; struct Node *next, *last;}*PtrToNode;typedef struct DequeRecord { struct Node *front, *rear;}*Deque;typedef enum { push, pop, inject, eject, disp, end } Operation; Deque CreateDeque(){ Deque deque = (Deque)malloc(sizeof(struct DequeRecord)); PtrToNode temp = (PtrToNode)malloc(sizeof(struct Node)); temp->last = NULL; temp->next = NULL; deque->front = temp; deque->rear = temp; return deque; } int Push(int X, Deque D){ PtrToNode temp; temp = (PtrToNode)malloc(sizeof(struct Node)); if (!temp) return 0; temp->Element = X; // 空队列情况 if (D->front == D->rear){ D->front->next = temp; temp->last = D->front; temp->next = NULL; D->rear = temp; return 1; } // 一般情况 temp->next = D->front->next; temp->last = D->front; D->front->next->last = temp; D->front->next = temp; return 1;} int Pop(Deque D){ PtrToNode temp; int X; // 空队列 if (D->front == D->rear) return ERROR; temp = D->front->next; X = temp->Element; // 如果只有一个节点的情况 if (D->front->next == D->rear){ D->rear = D->front; D->rear->next = NULL; free(temp); return X; } // 一般情况 temp->next->last = D->front; D->front->next = temp->next; free(temp); return X;} // 末尾添加一个元素int Inject(int X, Deque D){ PtrToNode temp; temp = (PtrToNode)malloc(sizeof(struct Node)); if (!temp) return 0; temp->Element = X; // 空队列 if (D->front == D->rear){ D->front->next = temp; temp->last = D->front; D->rear = temp; return 1; } D->rear->next = temp; temp->next = NULL; temp->last = D->rear; D->rear = temp; return 1;} // 从末尾移除一个元素int Eject(Deque D){ PtrToNode temp; int X; if (D->front == D->rear) return ERROR; temp = D->rear; X = temp->Element; D->rear = temp->last; D->rear->next = NULL; free(temp); return X;}Operation GetOp(){ int op; puts("请输入操作码:1 左入队,2 左出队,3 右入队,4 右出队,5 显示队列,6 退出"); scanf("%d",&op); switch(op){ case 1:return push; case 2:return pop; case 3:return inject; case 4:return eject; case 5:return disp; case 6:return end; default:exit(1); }}// 左边front,右边rear,next指向右,带头节点void PrintDeque(Deque D){ PtrToNode p1; p1=D->front->next; // 头节点,front所指单元的next域 printf("队列中剩余元素:"); while(p1!=D->rear->next){ printf("%d ",p1->Element); p1=p1->next; } printf("\n");} // 该双端队列可在两端进行入队和出队操作,在左边进行操作的时候要考虑头节点int main(){ int e; Deque D; int done = 0; D = CreateDeque(); while (!done) { switch(GetOp()) { case push: puts("push:"); scanf("%d", &e); if (!Push(e, D)) printf("Memory is Full!\n"); break; case pop: e = Pop(D); if ( e==ERROR ) printf("Deque is Empty!\n"); break; case inject: puts("inject:"); scanf("%d", &e); if (!Inject(e, D)) printf("Memory is Full!\n"); break; case eject: e = Eject(D); if ( e==ERROR ) printf("Deque is Empty!\n"); break; case disp: PrintDeque(D); break; case end: done = 1; break; } } return 0;}

 

转载于:https://www.cnblogs.com/Alexagender/p/10806313.html

你可能感兴趣的文章
关于React生命周期的学习
查看>>
webpack雪碧图生成
查看>>
搭建智能合约开发环境Remix IDE及使用
查看>>
Spring Cloud构建微服务架构—服务消费基础
查看>>
RAC实践采坑指北
查看>>
runtime运行时 isa指针 SEL方法选择器 IMP函数指针 Method方法 runtime消息机制 runtime的使用...
查看>>
LeetCode36.有效的数独 JavaScript
查看>>
Scrapy基本用法
查看>>
PAT A1030 动态规划
查看>>
自制一个 elasticsearch-spring-boot-starter
查看>>
软件开发学习的5大技巧,你知道吗?
查看>>
【人物志】美团前端通道主席洪磊:一位产品出身、爱焊电路板的工程师
查看>>
一份关于数据科学家应该具备的技能清单
查看>>
机器学习实战_一个完整的程序(一)
查看>>
Web框架的常用架构模式(JavaScript语言)
查看>>
如何用UPA优化性能?先读懂这份报告!
查看>>
这些Java面试题必须会-----鲁迅
查看>>
Linux 常用命令
查看>>
NodeJS 工程师必备的 8 个工具
查看>>
CSS盒模型
查看>>