队列
顺序队列
判断条件:
1 2 3
| Q.front=Q.rear=0//队空 队满判断不能简单的定义为Q.rear==Maxsize 执行多次的入队出队操作后 会出现Q.front=Q.rear-1;Q.rear=Maxsize 即为队列中只有队尾有一个元素 出现"上溢出" 但这个溢出并不是真正的溢出 队列中还有空位置所以是"假溢出"
|
循环队列
判断条件:
1 2 3 4 5 6
| Q.front=Q.rear=0 Q.front=(Q.rear+1)%Maxsize Q.front=Q.rear Q.rear=(Q.rear+1)%Maxsize Q.front=(Q.front+1)%Maxsize length=(Q.rear-Q.front+Maxsize)%Maxsize
|
牺牲最后一个存储单元 防止队列满时front与rear指向同一个元素导致无法判断是队列空还是满
所以队列满的条件为 rear就在front后面的存储单元
能够存储的元素数量为Maxsize-1
具体代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
| using namespace std;
typedef char ElemType; typedef struct { ElemType *data;//队列元素 int front,rear;//头指针与尾指针 }SqQueue; bool InitQueue(SqQueue &Q)//初始化空队列Q { Q.data = new ElemType[Maxsize]; if(!Q.data) return 0; Q.front=Q.rear=0;//头指针等于尾指针是队列为空的标志 return 1; } bool EnQueue(SqQueue &Q,ElemType e)//入队 { if((Q.rear+1)%Maxsize==Q.front) return 0;//队满 Q.data[Q.rear]=e; Q.rear=(Q.rear+1)%Maxsize;//队尾指针+1取模=向后移位 return 1; } bool DeQueue(SqQueue &Q,ElemType &e)//出队 { if(Q.front==Q.rear) return 0;//队空 e=Q.data[Q.front]; Q.front=(Q.front+1)%Maxsize;//队首指针+1取模=向后移位 return 1; } bool QueueLength(SqQueue Q)//循环队列长度 { cout<<(Q.rear-Q.front+Maxsize)%Maxsize; } void ShowQueue(SqQueue Q) { int i=Q.front; while(i!=Q.rear) { cout<<Q.data[i]<<" "; i=(i+1)%Maxsize; } cout<<endl; } int main() { SqQueue Q; int i,j,m,n; ElemType e; if(!InitQueue(Q)) cout<<"循环队列初始化失败"<<endl; cout<<"请输入要入队的元素个数 个数不能大于5否则入队失败"<<endl; cin>>j; for(i=1;i<=j;i++) { cout<<"请输入要入队的元素"<<endl; cin>>e; EnQueue(Q,e); } cout<<"元素入队成功"<<endl; do { cout<<"请输入对应功能的数字: 1.入队 2.出队 3.求循环队列长度 4.显示队列元素 "<<endl; cin>>m; switch(m) { case 1: { cout<<"请输入入队的元素"<<endl; cin>>e; EnQueue(Q,e); break; } case 2: { DeQueue(Q,e); cout<<"删除成功"<<endl; break; } case 3: { cout<<"队列长度为"; QueueLength(Q); cout<<endl; break; } case 4: { cout<<"显示队列的元素"<<endl; ShowQueue(Q); break; } } cout<<"是否继续执行操作 1.继续 2.退出"<<endl; cin>>n; }while(n==1); return 0; }
|
链式队列
顾名思义 链式队列就是同时带有头指针和尾指针的单链表
头指针指向队头结点 尾指针指向队尾结点 即单链表最后一个结点
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
| using namespace std; typedef char ElemType; typedef struct LNode { ElemType data; struct LNode *next;//next指向struct Lnode结构体变量 }LNode,*LinkNode;//结构体类型LNode 别名为*LinkNode typedef struct{ LNode *front,*rear; }LinkQueue; bool InitQueue(LinkQueue &Q){//初始化 Q.front=Q.rear=new LNode; Q.front->next=NULL; return 1; } bool EnQueue(LinkQueue &Q,ElemType e)//入列 { LNode *p=new LNode; p->data=e; p->next=NULL; Q.rear->next=p; Q.rear=p; } bool DeQueue(LinkQueue &Q,ElemType &e)//出队 { if(Q.front==Q.rear) return 0; LNode *p=new LNode; p=Q.front->next; e=p->data; Q.front->next=p->next; if(Q.rear==p) Q.rear=Q.front; delete p; return 1; } int DestroyQueue(LinkQueue &Q,ElemType &e)//销毁链队列 { while(!InitQueue(Q)) { DeQueue(Q,e); } delete Q.front; Q.front=Q.rear=NULL; return 1; } void DispQueue(LinkQueue Q)//显示链队列元素 { LNode *p=new LNode; LNode *q=new LNode; if(Q.rear==NULL) cout<<"队列为空"<<endl; else { p=Q.front->next; q=Q.rear; while(p!=NULL) { cout<<p->data<<" "; p=p->next; } cout<<endl; } } int main() { LinkQueue Q; int i,j,m,n; ElemType e; if(!InitQueue(Q)) cout<<"链队初始化失败"<<endl; cout<<"请输入要入队的元素个数"<<endl; cin>>j; for(i=1;i<=j;i++) { cout<<"请输入要入队的元素"<<endl; cin>>e; EnQueue(Q,e); } cout<<"元素入队成功"<<endl; do { cout<<"请输入对应功能的数字: 1.入队 2.出队 3.销毁链队列 4.显示队列元素 "<<endl; cin>>m; switch(m) { case 1: { cout<<"请输入入队的元素"<<endl; cin>>e; EnQueue(Q,e); break; } case 2: { DeQueue(Q,e); cout<<"删除成功"<<endl; break; } case 3: { if(!DestroyQueue(Q,e)) cout<<"销毁失败"<<endl; else cout<<"销毁成功"<<endl; break; } case 4: { cout<<"显示队列的元素"<<endl; DispQueue(Q); break; } } cout<<"是否继续执行操作 1.继续 2.退出"<<endl; cin>>n; }while(n==1); return 0; }
|