91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何使用c語言實現循環隊列

發布時間:2021-10-21 11:01:05 來源:億速云 閱讀:340 作者:小新 欄目:編程語言

這篇文章主要介紹如何使用c語言實現循環隊列,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

    隊列是一種先入先出的結構,數據從隊列頭出,隊尾進。在linux內核中進程調度,打印緩沖區都有用到隊列。

    隊列有多種實現方式,可以用鏈表,也可以用數組。這里用數組來實現一個簡單的循環隊列。首先創建一個大小為8的隊列如下,隊列頭尾指針指向同一塊內存,

    

如何使用c語言實現循環隊列

    當從隊列尾部插入一個數據后變成下面的情形,為了便于處理,這里始終會浪費一個空間

如何使用c語言實現循環隊列

    繼續插入數據,直到出現以下情形,表示隊列滿了,

如何使用c語言實現循環隊列

    接下來看一下出隊的情形,從隊列頭出隊3個元素,

如何使用c語言實現循環隊列

    再添加三個元素后隊列又變成滿的了,

如何使用c語言實現循環隊列

    在上面這種情況下面,如果再添加元素就會把隊列頭的元素覆蓋掉,如下:

如何使用c語言實現循環隊列

循環隊列實現代碼:

#include <stdio.h>
#include <stdlib.h>

/* 循環隊列大小*/
#define MAX 8     

typedef struct queue {
	int *que_array;
	int front;		//指向隊首
	int rear;		//指向隊尾
	int valid_cnt;	//隊列中有效的數據個數
    int total;      //隊列總大小
} queue_t;

typedef enum {
    E_NONE     = 0,
    E_NOMEMORY = 1,
    E_FAIL     = 2,
} error_t;

void init_queue(queue_t *que)
{
	que->que_array = (int *)malloc(sizeof(int) * MAX);
	if (que->que_array == NULL) {
		printf("no mem\n");
		exit(-E_NOMEMORY);
	}
	que->front     = 0;
    que->rear      = 0;
	que->valid_cnt = 0;
    que->total     = MAX;
}

/* 判斷隊列是否已滿 */
int is_full(queue_t *que)
{
	return (((que->rear + 1) % que->total) == (que->front));
}

/* 判斷隊列是否為空 */
int is_empty(queue_t *que)
{
	return (que->front == que->rear);
}

/* 元素入隊 */
void entry_queue(queue_t *que, int data)
{
	if (is_full(que)) {
		printf("隊列已滿,添加后有可能會覆蓋掉前面的元素 \n");
		que->front = ((que->front+1) % que->total);
	}
	que->que_array[que->rear % que->total] = data;
	que->rear = (que->rear+1) % que->total;
	que->valid_cnt++;
}

/* 元素出隊 */
int del_queue(queue_t *que)
{
    int tmp;
    
    if (is_empty(que)) {
        printf("隊列為空 \n");
        return -E_FAIL;
    }
    
    tmp = que->que_array[que->front % que->total];
	que->front = ((que->front+1) % que->total);
	que->valid_cnt--;
    
    return tmp;
}

int main(int argc, char *argv[])
{
    int tem_data,i;
	queue_t que;
    
	init_queue(&que);

#if 0
	for (i = 0; i < 7; i++) {
		entry_queue(&que, i + 1);
	}

    printf("出隊隊列中的所有元素 \n");
	while (!is_empty(&que)) {
		printf("%d,", del_queue(&que));
	}
#endif
	
    /*接下來,添加十個元素試試*/
    for (i = 0; i < 10; i++) {
		entry_queue(&que, i + 1);
	}

    printf("出隊隊列中的所有元素 \n");
	while (!is_empty(&que)) {
		printf("%d,", del_queue(&que));
	}
    
	return 0;
}

以上是“如何使用c語言實現循環隊列”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

栖霞市| 汝州市| 嘉鱼县| 通河县| 锡林浩特市| 日土县| 宜都市| 静海县| 大英县| 洛宁县| 石渠县| 洪泽县| 黄冈市| 麦盖提县| 汉寿县| 房产| 彰武县| 菏泽市| 遂溪县| 汉源县| 商南县| 青铜峡市| 体育| 澳门| 楚雄市| 香河县| 博客| 惠来县| 会昌县| 民权县| 苏尼特左旗| 广宗县| 高雄市| 安阳市| 启东市| 昌平区| 米易县| 邯郸县| 沐川县| 木里| 江都市|