1. 程式人生 > >環形佇列的定義與操作

環形佇列的定義與操作

看程式碼理解吧。。。

/*************************************************************************
    > File Name: queue_2.c
    > Author: Netcan
    > Mail: [email protected] 
    > Created Time: 2014/12/23 16:09:30
 ************************************************************************/

#include<stdio.h>
#include<malloc.h>

struct Queue { // 定義一個環形佇列(靜態佇列)
	int * pBase; // 存放資料的陣列
	int front; // 佇列首下標
	int rear; // 佇列尾下標,指向最後一個有效資料的後一個
	int size; // 佇列大小
};

void init_Queue(Queue *Q); // 初始化佇列
bool is_empty_Queue(Queue *Q); // 檢測佇列是否為空
bool is_full_Queue(Queue *Q); // 檢測佇列是否滿
bool in_Queue(Queue *Q, int val); // 入隊
bool out_Queue(Queue *Q); // 出隊
void traverse_Queue(Queue *Q); // 遍歷佇列

int main() {
	Queue Q; // 宣告一個佇列
	init_Queue(&Q); // 初始化
	if(is_empty_Queue(&Q)) // 檢測佇列是否為空
		puts("Queue empty.");
	in_Queue(&Q, 0); // 入隊
	in_Queue(&Q, 1);
	in_Queue(&Q, 2);
	in_Queue(&Q, 3);
	in_Queue(&Q, 4);
	in_Queue(&Q, 5);
	in_Queue(&Q, 6);
	in_Queue(&Q, 7);
	in_Queue(&Q, 8);
	in_Queue(&Q, 9);
	if(is_full_Queue(&Q)) // 檢測佇列是否滿
		puts("Queue full.");
	traverse_Queue(&Q); // 輸出佇列
	out_Queue(&Q); // 出隊
	out_Queue(&Q);
	traverse_Queue(&Q);

	return 0;
}

void init_Queue(Queue *Q)
{
	Q->size = 11; // 設佇列大小為11
	Q->pBase = (int *)malloc(sizeof(int)*Q->size); // 分配記憶體用於儲存資料
	Q->rear = Q->front = 0; // 初始化首尾下標
	return;
}

bool is_empty_Queue(Queue *Q)
{
	if(Q->front == Q->rear) // 如果首尾下標相等則空
		return true;
	else 
		return false;
}

bool is_full_Queue(Queue *Q)
{
	if( (Q->rear + 1)%Q->size == Q->front ) // 如果尾下標的下一個是首下標則滿
		return true;
	else
		return false;
}

bool in_Queue(Queue *Q, int val)
{
	if( is_full_Queue(Q) ) // 滿的話就不能入隊
		return false; 
	Q->pBase[Q->rear] = val; // 入隊
	Q->rear = (Q->rear + 1)%Q->size; // 尾下標後移
	return true;
}

bool out_Queue(Queue *Q)
{
	if( is_empty_Queue(Q) ) // 如果空的話就不能出隊
		return false;
	Q->front = (Q->front + 1) % Q->size; // 首下標後移表示出隊
	return true;
}

void traverse_Queue(Queue *Q)
{
	for(int i = Q->front; i != Q->rear; i = (i+1)%Q->size) // i用於輸出元素的下標,當i等於尾下標輸出結束
		printf("%3d",Q->pBase[i]);
	puts("");
	return;
}


執行圖:


相關推薦

環形佇列定義操作

看程式碼理解吧。。。 /************************************************************************* > File Name: queue_2.c > Author: N

鏈式佇列定義操作

看程式碼理解。。。 /************************************************************************* > File Name: queue.c > Author: Netcan

資料結構 筆記:樹的定義操作

樹是一種非線性的資料結構 樹是由n(n>=0)個結點組成的有限集合 -如果 n = 0,成為空樹; -如果n > 0,則: ·有一個特定的稱之為根(root)的結點 ·根據點只有直接後繼,但沒有直接前驅 ·除根以外的其他結點劃分為m(m>=0)個互補相交的有

隊列的定義操作——順序存儲和鏈式存儲

順序存儲 type void == int isf sem urn ont   隊列的 存儲結構 有 順序存儲 和 鏈式存儲。   1. 隊列的順序存儲與操作 (循環隊列) 1 typedef int Position; 2 struct QNode { 3

堆的定義操作

與操作 down 下標 代碼 其中 cap 找到 truct style   如題,堆的定義與操作。 1 #define MAXDATA 1000 /* 該值應根據具體情況定義為大於堆中所有可能元素的值 */ 2 3 typedef struct H

資料結構 筆記:圖的定義操作

定義 -圖是由頂點集合(Vertex)及頂點間的關係集合(Edge)組成的一種資料結構 -Graph = (V,E) -V= 是頂點的有窮非空集合 -E=是頂點之間關係的有窮集合 無向邊 -頂點x和y之間的邊沒有方向,則稱該邊為無向邊 -<x,y> 與<

線性表的定義操作---連結串列

typedef struct LNode *PtrToLNode; struct LNode { ElementType Data; PtrToLNode Next; }; typedef PtrToLNode Position; typedef

【資料結構】環形佇列的基本操作

編譯環境VS2008 Queue.h ####為了解決順序佇列的假溢位的問題,設計了環形佇列 #pragma once #include <assert.h> #include <s

Javascript Jquery 中的陣列定義操作

1.認識陣列陣列就是某類資料的集合,資料型別可以是整型、字串、甚至是物件Javascript不支援多維陣列,但是因為數組裡面可以包含物件(陣列也是一個物件),所以陣列可以通過相互巢狀實現類似多維陣列的功能1.1 定義陣列宣告有10個元素的陣列var a = new Array(10);此時為a已經開闢了記憶體

環形佇列——使用者對使用者自定義資料型別的相關操作

#ifndef CUSTOMER_H #define CUSTOMER_H #include using namespace std; class Customer { public: Customer(string name="",int age=0); void p

列表、元組、字典、集合的定義操作綜合練習

alt 定義 cor sco end OS bubuko move remove l = [‘Lucy‘,‘Abb‘,‘Lily‘] l.append(‘Abb‘) l.pop() print(1) t = (‘Lucy‘,‘Abb‘,‘Lily‘) scores =

PHP如何定義類及其成員屬性操作

所有 有用 裏的 class 被子 析構 new 有一點 簡單 1、類的定義: 類的關鍵字定義使用class 1.定義一個空類 Class Person{}; 2.定義一個有成員屬性和操作的類 Class Person{ //成員屬性 $name = ‘‘

JavaScript的函式(定義解析、匿名函式、函式傳參、return關鍵字)和陣列(操作資料的方法、多維陣列、陣列去重)

函式 函式就是重複執行的程式碼片。 1、函式定義與執行 <script type="text/javascript"> // 函式定義 function aa(){ alert('hello!'); } // 函式執行

集合的定義並查操作

turn def 名稱 表示 span code += clas 整數   集合的定義與並查操作。 1 #define MAXN 1000 /* 集合最大元素個數 */ 2 typedef int ElementType;

佇列定義操作

一.定義 佇列是一種先進先出的邏輯結構。將允許刪除元素的一端稱為隊頭,允許插入元素的一端稱為隊尾。將沒有結點的佇列稱為空佇列。佇列中的每個結點包括資料元素本身和指向其後結點的指標。佇列的資料結構包括指向隊頭的指標、指向隊尾的指標和隊中結點的個數。 二.佇列結點的定義 t

環形佇列——對int型別的資料進行操作

#ifndef MYQUEUE_H #define MYQUEUQ_H class MyQueue { public: MyQueue(int queueCapacity); //InitQueue(&Q) 建立佇列 virtual ~MyQueue();

佇列的基本操作——鏈式佇列的類模板定義

定義      佇列(Queue)是隻允許在一端進行插入,而在另一端進行刪除的運算受限的線性表   (1)允許刪除的一端稱為隊頭(Front)。   (2)允許插入的一端稱為隊尾(Rear)。   (

環形佇列的建立以及一些基本的操作

我們的環形佇列長什麼樣子的尼,那幾句話也描述不出來概括不了他的樣子,還是拿一張圖看一下吧 在沒有插入資料時候他也就是長這個樣子了,首位隊外首位指標相交,都在這個初始佇列塊子的位置。 唯一需要注意的一點是我們這裡定義的這個環形佇列的==頭 ==只放了一個指標,我們資料的。

生產者消費者模型(基於單鏈表、環形佇列、多執行緒、多消費多生產)

#include <pthread.h> #include <unistd.h> #include <stdlib.h> #include <signal.h> #include <semaphore.h> #define SIZE 10 sem_t

定義控制元件之繪圖篇(四):canvas變換操作

前言:前幾篇講解了有關canvas繪圖的一些操作,今天更深入一些,講講對畫布的操作,這篇文章不像前幾篇那麼容易理解,如果以前沒有接觸過畫布的童鞋可能比較難以理解,為什麼會這樣。我儘量多畫圖,讓大家更清晰明白。前幾天偶然看到一篇文章,寫的樸實無華,充滿正能量,我非常喜歡裡面的一