<資料結構>靜態佇列基本功能實現
前言
提示:本篇主要是本小白大學期間對資料結構實驗的一些基本程式碼功能實現,希望對一同資料結構的夥伴有所幫助。
提示:以下是本篇文章正文內容,下面案例可供參考
一、線性結構兩種常見應用之一 —— 佇列
定義:一種可以實現“先進先出“的儲存結構
分類:鏈式佇列——用連結串列實現
靜態連結串列——用陣列實現(靜態佇列通常必須是迴圈佇列)
主要演算法:入隊 出隊
應用:所有與時間有關的操作都與佇列有關
二、使用步驟
1.迴圈佇列偽演算法講解
1.為什麼要用迴圈佇列?
答:無迴圈會造成假溢位
2.迴圈佇列需要幾個引數來確定?
答:兩個;兩個引數不同場合有不同含義
⑴對列初始化
front 和 rear 的值為零
⑵佇列非空
front 代表的是佇列第一個元素
rear 代表的是佇列的最後一個有效元素的下一個元素
⑶佇列空
front 和 rear 的值相等,不一定為零
3.迴圈佇列入隊演算法思路
⑴將值存入rear所代表的位置
錯誤演算法:r=r+1;
正確演算法:r=(r+1)%陣列長度
4.出隊偽演算法
答:f =(f+1)%陣列長度
5.如何判斷迴圈佇列是否為空
答:如果front 與 rear值相等,則該佇列一定為空
6.如何判斷迴圈佇列是否已滿
答:兩種方式
⑴多增加一個表標識引數
⑵少用一個元素(通常使用這種方式)
如果rear和front緊接著,則佇列已滿
if(rear+1)%陣列長度 == front)
{已滿}else {沒滿}
提示:front的值可以比rear大,也可能比rear小,也可能相等
2.佇列基本功能
如下(示例):
bool emput_queue(queue *PQ);
void traverse(queue *PQ,int num);
bool out_queue(queue *PQ, int *pval,int num);
bool full_queue(queue *PQ,int num);
bool en_queue(queue *PQ,int num);
void init(queue *PQ,int num);
2.程式碼功能實現
如下(示例):
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
typedef struct queue
{
int *Pbase;
int front;
int rear;
}queue;
extern bool emput_queue(queue *PQ);//判斷隊空
extern void traverse(queue *PQ,int num);//遍歷
extern bool out_queue(queue *PQ, int *pval,int num);//出隊
extern bool full_queue(queue *PQ,int num);//判斷隊滿
extern bool en_queue(queue *PQ,int num);//入隊
extern void init(queue *PQ,int num);//初始化
int main()
{
int num;
int pval;
int function;
queue PQ;
printf("please tell me how many num did you want to input into queue:\n");
scanf("%d",&num);
init(&PQ,num);
while(1)
{
printf("1.en_queue\t\t2.out_queue\n");
printf("please input which function did you you choose;\n");
scanf("%d",&function);//選擇功能
switch(function)
{
case 1 : en_queue(&PQ,num);
traverse(&PQ,num);
continue;
case 2 : out_queue(&PQ,&pval,num);
traverse(&PQ,num);
printf("out a num: %d\n",pval);//輸出出隊的資料
continue;
}
}
return 0 ;
}
void init(queue *PQ,int num)
{
PQ->Pbase =(int *)malloc(sizeof(int)*num);//分配陣列空間
PQ->front = 0;
PQ ->rear = 0;
return ;
}
bool en_queue(queue *PQ,int num)
{
if(full_queue(PQ,num))//判斷隊滿
{
printf("full_queue\n");
return false;
}
else
{
int val;
printf("please input a num :");
scanf("%d",&val);//輸入要入隊的數值
PQ->Pbase[PQ->rear]=val;//賦值
PQ->rear=(PQ->rear+1)%num;//OQ->rear+1
return true;
}
}
bool full_queue(queue *PQ,int num)
{
if((PQ->rear+1)%num == PQ->front)
{
return true;
}
else
{
return false;
}
}
bool out_queue(queue *PQ, int *pval,int num)
{
if(emput_queue(PQ))//判斷隊空
{
return false;
}
else
{
*pval = PQ->Pbase[PQ->front];//頂端數值賦給pval
PQ->front = (PQ->front+1)%num;//取出front(底端)資料
return true;
}
}
bool emput_queue(queue *PQ)
{
if(PQ->rear == PQ->front)
{
printf("NO num now\n");
return true;
}
else
{
return false;
}
}
void traverse(queue *PQ,int num)
{
int i = PQ->front;
while(i != PQ->rear)//未到隊尾
{
printf("%d\t",PQ->Pbase[i]);
i=(i+1)%num;
}
putchar('\n');
return ;
}
總結
提示:這裡對文章進行總結:
例如:本篇主要是對靜態佇列的基本功能程式碼實現,主要是為了判斷隊空和隊滿,演算法中引入了取餘操作比較新穎,讀者可以結合書中迴圈佇列圖分析,再對照功能程式碼,邏輯理解後,對佇列的認識就會清晰許多。
相關文章
- js實現資料結構--佇列JS資料結構佇列
- 資料結構之php實現佇列資料結構PHP佇列
- 靜態佇列,迴圈陣列實現佇列陣列
- 資料結構-js實現棧和佇列資料結構JS佇列
- 【php實現資料結構】鏈式佇列PHP資料結構佇列
- 【資料結構】佇列(順序佇列、鏈佇列)的JAVA程式碼實現資料結構佇列Java
- 資料結構-迴圈佇列(Python實現)資料結構佇列Python
- 資料結構-棧&佇列&Deque實現比較資料結構佇列
- java 資料結構 之 佇列的實現 (二)Java資料結構佇列
- php實現基本資料結構之棧、佇列PHP資料結構佇列
- 資料結構-佇列資料結構佇列
- 【資料結構-----佇列】資料結構佇列
- 資料結構 - 佇列資料結構佇列
- 【資料結構】迴圈佇列 C語言實現資料結構佇列C語言
- python資料結構之棧、佇列的實現Python資料結構佇列
- 【資料結構】順序佇列的實現(c++)資料結構佇列C++
- 【資料結構】迴圈佇列的實現(c++)資料結構佇列C++
- Java版-資料結構-佇列(陣列佇列)Java資料結構佇列陣列
- C 語言實現使用靜態陣列實現迴圈佇列陣列佇列
- 資料結構之「佇列」資料結構佇列
- 資料結構-佇列-樹資料結構佇列
- 資料結構—棧/佇列資料結構佇列
- 資料結構-佇列、棧資料結構佇列
- 資料結構之PHP(最大堆)實現優先佇列資料結構PHP佇列
- 資料結構 使用2個棧實現一個佇列資料結構佇列
- Java版-資料結構-佇列(迴圈佇列)Java資料結構佇列
- java實現單連結串列、棧、佇列三種資料結構Java佇列資料結構
- JavaScript資料結構之-佇列JavaScript資料結構佇列
- 資料結構之佇列(Queue)資料結構佇列
- JavaScript資料結構03 – 佇列JavaScript資料結構佇列
- JavaScript資料結構之佇列JavaScript資料結構佇列
- js資料結構--佇列(queue)JS資料結構佇列
- 資料結構-棧與佇列資料結構佇列
- 資料結構—棧和佇列資料結構佇列
- JavaScript資料結構03 - 佇列JavaScript資料結構佇列
- 資料結構(棧和佇列)資料結構佇列
- 資料結構筆記——佇列資料結構筆記佇列
- 【資料結構】--棧和佇列資料結構佇列