網站首頁 編程語言 正文
1.隊列的定義
隊列 (Queue)是另一種限定性的線性表,它只允許在表的一端插入元素,而在另一端刪除元素,所以隊列具有先進先出(Fist In Fist Out,縮寫為FIFO)的特性。在隊列中,允許插入的一端叫做隊尾(rear),允許刪除的一端則稱為隊頭(front)。 假設隊列為q=(a1,a2,…,an),那么a1就是隊頭元素,an則是隊尾元素。隊列中的元素是按照a1、a2、…、an的順序進入的, 退出隊列也必須按照同樣的次序依次出隊,也就是說,只有在a1、a2、…、an-1都離開隊列之后,an才能退出隊列。
2.隊列的表示和實現
鏈隊列可以定義如下:
#define TRUE 1 #define FALSE 0 typedef struct QNode{ QElemType data; struct QNode *next; }QNode, *QueuePtr; typedef struct{ QueuePtr front; QueuePtr rear; }LinkQueue;
(1) 初始化操作
Status InitQueue(LinkQueue &Q) { Q.front = Q.rear = (Queueptr) malloc(sizeof(QNode)); if(!Q.front) exit ( OVERFLOW); Q.front ->next = NULL; return OK; }
(2)銷毀隊列
Status DestroyQueue(LinkQueue &Q) { while(Q.front) { Q.rear = Q.front->next; free (Q.front); Q.front = Q.rear; } return OK; }
(3) 入隊操作
Status EnQueue (LinkQueue &Q, QelemType e) { p= (QueuePtr) malloc(sizeof(QNode)); if (!p) exit ( OVERFLOW); p->data = e; p->next = NULL; Q.rear -> next =p; Q.rear = p; return OK; }
(4) 出隊操作
Status DeQueue (LinkQueue &Q, QelemType &e) { if ( Q.front == Q.rear) return ERROR; p=Q.front->next; e=p->data; Q.front->next =p->next; if (Q.rear == p) Q.rear = Q.front; free(p); return OK; }
附錄完整代碼:
#include<iostream> using namespace std; #define OK 1 #define FALSE 0 typedef int QElemType; typedef int Status; typedef struct QNode{ QElemType data; struct QNode *next; }QNode,*QueuePtr; typedef struct{ QueuePtr font; QueuePtr near; }LinkQueue; Status InitQueue(LinkQueue &Q) { Q.font=(QueuePtr)malloc(sizeof(QNode)); if(!Q.font) exit(FALSE); Q.font->next=NULL; Q.near=Q.font; return OK; } Status QueueEmpty(LinkQueue Q) { if(Q.font->next) return OK; return FALSE; } Status EnQueue(LinkQueue &Q,QElemType e) { QueuePtr p=(QueuePtr)malloc(sizeof(QNode)); p->data=e; Q.near->next = p; Q.near = Q.near->next; p->next = NULL; return OK; } Status DeQueue(LinkQueue &Q,QElemType &e) { if(!Q.font->next) return FALSE; QueuePtr p; p=Q.font->next; e=p->data; Q.font->next=p->next; if(Q.near==p) Q.near=Q.font; //當是最后一個元素時,Q.font=NULL,Q.near=Q.font free(p); return OK; } Status ClearQueue(LinkQueue &Q) { QueuePtr p; p=Q.font->next; QueuePtr q; while(p) { q=p; p=p->next; Q.font->next=p; free(q); } Q.near=Q.font; return OK; } void menu() { cout<<"初始化隊列:1"<<endl; cout<<"入隊:2"<<endl; cout<<"出隊:3"<<endl; cout<<"清空隊列:4"<<endl; cout<<"退出:5"<<endl; } int main() { LinkQueue Q; while(true) { int n; menu(); scanf("%d",&n); int e=-1; switch(n) { case 1: InitQueue(Q); continue; case 2: printf("請輸入一個元素"); scanf("%d",&e); EnQueue(Q,e); continue; case 3: DeQueue(Q,e); printf("\n出隊元素%d\n",e); continue; case 4: ClearQueue(Q); printf("清空成功\n"); continue; default: break; } if(n==5)break; } }
總結
原文鏈接:https://blog.csdn.net/m0_52118763/article/details/122203877
相關推薦
- 2022-05-23 ELK與Grafana聯合打造可視化監控來分析nginx日志_nginx
- 2022-10-24 vscode使用Eslint+Prettier格式化代碼的詳細操作_C 語言
- 2022-10-28 一文帶你了解Python列表生成式應用的八重境界_python
- 2022-05-18 C語言?動態內存開辟常見問題解決與分析流程_C 語言
- 2022-09-13 Android?Studio實現簡單補間動畫_Android
- 2022-05-12 Kotlin List的創建與取值 getOrElse getOrNull
- 2023-07-04 如何替換spring boot中spring框架的版本
- 2022-08-16 c#中使用BackgroundWorker的實現_C#教程
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支