資料結構之佇列
阿新 • • 發佈:2019-01-23
一、順序佇列
待補充、、、、、、、
二、鏈佇列
#include <iostream> #include <cstdio> #include <cstdlib> using namespace std; typedef int ElemType; typedef enum{ OVERFLOW=-1, ERROR=0, OK=1 }Status; typedef struct Qnode{ ElemType data; struct Qnode *next; }Qnode,*QueuePtr; typedef struct{ QueuePtr front; QueuePtr rear; }LinkQueue; Status InitQueue(LinkQueue &Q){ Q.front=Q.rear=new Qnode; Q.front->next=NULL; return OK; } Status QueueExit(LinkQueue Q){ return Q.front&&Q.rear?OK:ERROR; } Status ClearQueue(LinkQueue &Q){ if(!QueueExit(Q)) return ERROR; Qnode *p=Q.front->next; while(p){ Q.front->next=p->next; delete p; p=Q.front->next; } Q.rear=Q.front; return OK; } Status DestroyQueue(LinkQueue &Q){ if(!QueueExit(Q)) return ERROR; ClearQueue(Q); Q.front=Q.rear=NULL; return OK; } Status QueueEmpty(LinkQueue Q){ return Q.front==Q.rear?OK:ERROR; } int QueueLenth(LinkQueue Q){ if(!QueueExit(Q)) return -1; Qnode *p=Q.front->next; int len=0; while(p){ len++; p=p->next; } return len; } Status EnQueue(LinkQueue &Q,ElemType e){ Qnode *p=new Qnode; p->data=e; p->next=NULL; Q.rear->next=p; Q.rear=p; return OK; } Status DeQueue(LinkQueue &Q,ElemType &e){ if(Q.front==Q.rear) return ERROR; Qnode *p=Q.front->next; e=p->data; Q.front->next=p->next; if(Q.rear==p) Q.rear=Q.front; delete p; return OK; } ElemType GetHead(LinkQueue Q){ if(Q.front!=Q.rear) return Q.front->next->data; } void QueueTraverse(LinkQueue Q){ if(!QueueExit(Q)){ printf("鏈隊不存在,遍歷失敗!\n"); return; } if(QueueEmpty(Q)){ printf("鏈隊為空,遍歷失敗!\n"); return; } Qnode *p=Q.front->next; while(p){ printf("%d ",p->data); p=p->next; } printf("\b\n"); } void Menu(){ printf("輸入數字選擇測試函式\n"); printf("1、入隊\n"); printf("2、出隊\n"); printf("3、隊頭\n"); printf("4、隊長\n"); printf("5、隊空\n"); printf("6、清空\n"); printf("7、銷燬\n"); printf("8、遍歷\n"); printf("0、退出\n"); } void BacktoMenu(){ printf("按任意鍵返回選單\n"); getchar(); } int main(){ printf("按任意鍵建立鏈棧\n"); getchar(); LinkQueue Q; if(InitQueue(Q)) printf("建立成功\n"); else printf("建立失敗\n"); printf("按任意鍵進入選單\n"); getchar(); while(1){ system("cls"); Menu(); int op; ElemType e; scanf("%d",&op); getchar(); switch(op){ case 1: if(!QueueExit(Q)) printf("鏈隊不存在,請先建立鏈隊\n"); else{ printf("請輸入要入隊的元素\n"); scanf("%d",&e); getchar(); EnQueue(Q,e); printf("入隊成功\n"); } BacktoMenu(); break; case 2: if(!QueueExit(Q)) printf("鏈隊不存在,請先建立鏈隊\n"); else if(DeQueue(Q,e)) printf("出隊成功,隊頭元素為%d\n",e); else printf("隊空,出隊失敗\n"); BacktoMenu(); break; case 3: if(!QueueExit(Q)) printf("鏈隊不存在,請先建立鏈隊\n"); else if(QueueEmpty(Q)) printf("隊空,取頂失敗\n"); else{ e=GetHead(Q); printf("取頂成功,頂頭元素為%d\n",e); } BacktoMenu(); break; case 4: if(QueueLenth(Q)==-1) printf("鏈隊不存在,請先建立鏈隊\n"); else printf("隊長為%d\n",QueueLenth(Q)); BacktoMenu(); break; case 5: if(!QueueExit(Q)) printf("鏈隊不存在,請先建立鏈隊\n"); else QueueEmpty(Q)?printf("隊空\n"):printf("隊非空\n"); BacktoMenu(); break; case 6: if(ClearQueue(Q)) printf("清空成功\n"); else printf("鏈隊不存在,請先建立鏈隊\n"); BacktoMenu(); break; case 7: if(DestroyQueue(Q)) printf("銷燬成功\n"); else printf("鏈隊不存在,請先建立鏈隊\n"); BacktoMenu(); break; case 8: QueueTraverse(Q); BacktoMenu(); break; case 0: exit(0); } } return 0; }