数据结构与算法(3-2)队列(顺序队列、循环队列与链队列)
生活随笔
收集整理的這篇文章主要介紹了
数据结构与算法(3-2)队列(顺序队列、循环队列与链队列)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄
一、順序隊列
1、存儲結構
2、入隊和出隊?
?總代碼
二、循環隊列
總代碼:
三、鏈隊列
1、存儲結構
2、入隊和出隊
總代碼
一、順序隊列
隊列特征:先進后出、后進后出。
1、存儲結構
//隊列
typedef struct
{int data[MAXSIZE]; //存放元素int front; //隊首(出隊)int rear; //隊尾(入隊)
}SqQueue;
SqQueue Q;
2、入隊和出隊?
入隊:從隊尾放入元素,rear++
出隊:從隊首取出元素,front++
?總代碼
//順序隊列
//主要用front和rear分別指向隊首和隊尾
//進棧時:rear指向處放入數據,rear++
//出棧時,front指向處取出數據,front++
#include<stdio.h>#define MAXSIZE 6//隊列
typedef struct
{int data[MAXSIZE]; //存放元素int front; //隊首(出隊)int rear; //隊尾(入隊)
}SqQueue;
SqQueue Q;void Init_List()
{Q.front = 0;Q.rear = 0;
}//入隊
void EnQueue(int num)
{if (Q.rear >= MAXSIZE) //判斷隊列滿{printf("棧已滿!\n");return;}Q.data[Q.rear++] = num; //元素入隊,rear++
}//出隊
int DeQueue()
{int s;if (Q.front == Q.rear) //判斷隊列空{printf("???#xff01;\n");return -1;}return Q.data[Q.front++]; //元素出隊,front++
}int main()
{Init_List(); //初始化//入隊EnQueue(0);EnQueue(1);EnQueue(2);EnQueue(3);EnQueue(4);EnQueue(5);//EnQueue(5); //隊列滿測試//出隊printf("%d\n", DeQueue());printf("%d\n", DeQueue());printf("%d\n", DeQueue());printf("%d\n", DeQueue());printf("%d\n", DeQueue());printf("%d\n", DeQueue());return 0;
}
二、循環隊列
存儲結構和隊列一樣,把存儲空間當成一個環,完成首位相接,完成循環,其核心是一個算法表達式:
//為什么要加1:如果不加1,那么和隊列為空的條件相同(front==rear)
Q.rear = (Q.rear + 1) % MAXSIZE; //起到循環的效果(循環隊列入隊)Q.front = (Q.front + 1) % MAXSIZE; //起到循環的效果(循環隊列出隊)
用上面的代碼,把空間范圍禁錮在MAXSIZE之內,不會超過其范圍。rear和front也只會在里面移動。
總代碼:
//循環隊列
//用(front+1)%MAXSIZE完成在MAXSIZE內的循環
//(rear+1)%MAXSIZE同理
//為什么要加1:如果不加1,那么和隊列為空的條件相同(front==rear)
#include<stdio.h>#define MAXSIZE 6 //大小為6,但循環隊列少存一個,實際只存5個元素//隊列
typedef struct
{int data[MAXSIZE];int front;int rear;
}SqQueue;
SqQueue Q;void Init_List()
{Q.front = 0;Q.rear = 0;
}//入隊
void EnQueue(int num)
{if ((Q.rear + 1) % MAXSIZE == Q.front) //判斷隊列滿{printf("隊列已滿!\n");return;}Q.data[Q.rear] = num;Q.rear = (Q.rear + 1) % MAXSIZE; //起到循環的效果(循環隊列入隊)
}//出隊
int DeQueue()
{int s;if (Q.front == Q.rear) //判斷隊列空{printf("隊列已空!\n");return -1;}s = Q.data[Q.front];Q.front = (Q.front + 1) % MAXSIZE; //起到循環的效果(循環隊列出隊)return s;
}int main()
{Init_List(); //初始化//入隊EnQueue(0);EnQueue(1);EnQueue(2);EnQueue(3);EnQueue(4);//EnQueue(5); //隊滿測試//出隊printf("%d\n", DeQueue());printf("%d\n", DeQueue());printf("%d\n", DeQueue());printf("%d\n", DeQueue());printf("%d\n", DeQueue());//printf("%d\n", DeQueue()); //隊空測試return 0;
}
三、鏈隊列
1、存儲結構
*rear和*front由原來的int變成了指針,分別指向隊尾和隊首元素的地址。
前后元素通過*next相連接。
//鏈隊列
typedef struct Node
{int data;Node* next;
}Node;
Node* head; //頭結點
Node* front; //隊首
Node* rear; //隊尾
2、入隊和出隊
入隊:從隊尾放入元素,rear指向新的隊尾元素。
出隊:從隊首取出元素,front指向新的隊首元素。
總代碼
//鏈隊列
//可以實現自由插入
//鏈隊列用front->next指向隊首元素,rear指向隊尾元素
//入隊rear動; 出隊front->next動(front不動)
#include <stdio.h>
#include <malloc.h>//鏈隊列
typedef struct Node
{int data;Node* next;
}Node;
Node* head; //頭結點
Node* front; //隊首
Node* rear; //隊尾void Init_List()
{head = (Node*)malloc(sizeof(Node));head->next = NULL;front = head;rear = head;
}//入隊
void EnQueue(int num)
{Node* p = (Node*)malloc(sizeof(Node));p->data = num;p->next = NULL;rear->next = p; //連接p(head不存放值)rear = p; //指向p
}//出隊
int DeQueue()
{int num;Node* s;if (rear == front){printf("隊列為空!\n");return -1;}s = front->next;num = s->data;front->next = front->next->next;free(s);return num;
}int main()
{Init_List(); //初始化//入隊EnQueue(0);EnQueue(1);EnQueue(2);EnQueue(3);//出隊printf("%d\n", DeQueue());printf("%d\n", DeQueue());printf("%d\n", DeQueue());printf("%d\n", DeQueue());return 0;
}
可能有寫的不好或者不對的地方,希望大家批評指正!Thanks?(・ω・)ノ
總結
以上是生活随笔為你收集整理的数据结构与算法(3-2)队列(顺序队列、循环队列与链队列)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据结构与算法(3-1)栈(顺序栈、两栈
- 下一篇: 数据结构与算法(5)字符串(BF算法、K