迴圈佇列的實現
需求描述:實現一個固定長度的字元快取管理結構,實現字串的寫入和讀出。
1)佇列加資料,向cb尾追加長為length的字串,存在putting中; 當緩衝剩餘空間remain<length時,追加長為remain的字串,函式返回實際有效存放到緩衝中的字串;
2)佇列取資料,在cb中讀取長度為length的字串,存於getting中;當佇列存放的字元數used<length時,只讀取長為used的字串,讀取字串後,佇列中相應緩衝不再使用。
特別宣告,本文原始碼在VC6.0上測試通過。
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
// 定義佇列緩衝長度,實際長度為SIZE-1
#define SIZE 10
// 定義陣列迴圈佇列
typedef struct cb_s
{
char *queue;
unsigned long front;
unsigned long rear;
}cb_t;
void cbInit(cb_t **cb, unsigned long size); // 佇列初始化函式
unsigned long cbPuts(cb_t *cb, char *putting, unsigned long length); // 佇列加資料函式
char *cbGets(cb_t *cb, unsigned long length, char *getting); // 佇列取資料函式
void cbDestroy(cb_t *cb); // 佇列釋放函式
void main(void)
{
cb_t *pcb = NULL;
char *putting = "a+b#c*d-e!f&g";
char getting[SIZE] = {0};
cbInit(&pcb, SIZE);
printf("Test of [cbPuts] operation>>\n");
printf("%d\n\n", cbPuts(pcb, putting, 12));
printf("Test of [cbGets] operation>>\n");
printf("%s\n\n", cbGets(pcb, 5, getting));
printf("Test of [cbPuts] operation>>\n");
printf("%d\n\n", cbPuts(pcb, putting, 4));
printf("Test of [cbGets] operation>>\n");
printf("%s\n\n", cbGets(pcb, 5, getting));
printf("Test of [cbGets] operation>>\n");
printf("%s\n\n", cbGets(pcb, 5, getting));
cbDestroy(pcb);
}
/* 佇列初始化函式,cb為佇列緩衝,size是緩衝大小 */
void cbInit(cb_t **cb, unsigned long size)
{
*cb = (cb_t *)malloc(sizeof(cb_t));
if ((NULL == *cb) || (NULL == cb))
{
printf("cbInit:Insufficient Memory!\n");
exit(0);
}
(*cb)->queue = (char *)malloc(size * sizeof(char));
if (NULL == (*cb)->queue)
{
printf("cbInit:Insufficient Memory!\n");
exit(0);
}
memset((*cb)->queue, 0, size * sizeof(char));
(*cb)->front = 0;
(*cb)->rear = 0;
}
/* 佇列加資料函式,向cb尾追加長為length的字串,存在putting中;
當緩衝剩餘空間remain<length時,追加長為remain的字串,函式返回實際有效存放到緩衝中的字串 */
unsigned long cbPuts(cb_t *cb, char *putting, unsigned long length)
{
unsigned long index = 0;
if ((NULL == cb) || (NULL == putting))
{
printf("cbPuts:Insufficient Memory!\n");
exit(0);
}
if ((cb->rear +1) % SIZE == cb->front) // 佇列已滿
{
printf("Queue is full!\n");
return 0;
}
else // 佇列未滿
{
for (index = 0; index < length; index++)
{
if ((cb->rear + 1) % SIZE != cb->front) // 佇列未滿,逐字元入佇列
{
cb->rear = (cb->rear + 1) % SIZE;
*(cb->queue + cb->rear) = *(putting + index);
}
else
{
break; // 佇列剩餘空間<length,佇列滿時跳出迴圈;否則,跳過該語句
}
}
return index;
}
}
/* 佇列取資料函式,在cb中讀取長度為length的字串,存於getting中;
當佇列存放的字元數used<length時,只讀取長為used的字串,讀取字串後,佇列中相應緩衝不再使用 */
char *cbGets(cb_t *cb, unsigned long length, char *getting)
{
unsigned long index = 0;
if (NULL == cb)
{
printf("cbGets:Insufficient Memory!\n");
exit(0);
}
if (cb->rear == cb->front) // 佇列為空
{
printf("Queue is empty!\n");
return NULL;
}
else // 佇列非空
{
for (index = 0; index < length; index++)
{
if (cb->rear != cb->front) // 佇列非空,逐字元出佇列
{
cb->front = (cb->front + 1) % SIZE;
*(getting + index) = *(cb->queue + cb->front);
*(cb->queue + cb->front) = 0; // 出佇列快取清零
}
else
{
break; // 佇列存放位元組數<length,佇列空時跳出迴圈;否則,跳過該語句
}
}
*(getting + index) = '\0';
return getting;
}
}
/* 佇列釋放函式,釋放cb佔用的記憶體 */
void cbDestroy(cb_t *cb)
{
if (NULL == cb)
{
printf("cbDestroy:Insufficient Memory/Queue isnot Existing!\n");
exit(0);
}
free(cb->queue);
cb->queue = NULL;
free(cb);
}
相關推薦
C語言--迴圈佇列實現
#include <stdio.h> #include <malloc.h> #include <stdlib.h> /* 迴圈佇列 */ typedef struct Queue { int *p_base; int front; int rear; }
迴圈佇列實現 622.Design Circular Queue
import java.util.*; class MyCircularQueue { public int[] data; private int p_start; private int p_tail; private int k; priv
基於 Linux 的迴圈佇列實現程式碼
/************************************************************************* > File Name: cyclequeue.c > Author: Wenfei6316 >
資料結構_佇列-迴圈佇列實現模擬舞伴配對問題
參考《資料結構》(C語言版)主編 秦鋒和http://www.cnblogs.com/xing901022/p/3534937.html部落格,這篇部落格我認為作者介紹簡單明瞭。 採用空閒一個位置的方式,即N個元素空間的迴圈佇列最多隻能存放N-1個有效元素。1) 迴圈佇列初
資料結構(三)——佇列及實現、迴圈佇列實現
一、佇列 佇列是一種特殊的線性表,它只允許在表的前端(front)進行刪除操作,而在表的後端(rear)進行插入操作。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。佇列中沒有元素時,稱為空佇
C++基於模版的迴圈佇列實現
近期因為要反反覆覆使用佇列,而佇列需要儲存的元素格式又千差萬別,在網上搜了下貌似雙邊佇列可以解決這個問題,但是效率有點低。於是自己寫了個基於模版的迴圈佇列實現方式,有任何不合理之處還請各位大牛輕怕。 #pragma once template<class T>
利用迴圈佇列實現楊輝三角的列印
#define MAXSIZE 100 #include <iostream> using namespace std; typedef int SElemType; typedef struct { SElemType *base; int front;
C 迴圈佇列實現
一個迴圈佇列的C語言實現,資料型別Queue定義如下,注意在 typedef struct{...}Queue; 中Queue為資料型別,而在struct {...}Queue; 中Queue為一個變數
js-佇列使用-迴圈佇列實現擊鼓傳花
佇列是遵循FIFO(先進先出)原則。 迴圈佇列是修改版的佇列實現。 擊鼓傳花遊戲的程式碼如下: function Queue() {//佇列類 var items = []; this.enqu
佇列定義及實現、迴圈佇列實現
一、佇列 佇列是一種特殊的線性表,它只允許在表的前端(front)進行刪除操作,而在表的後端(rear)進行插入操作。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。佇列中沒有元素時,稱為空佇列。在佇列這種資料結構中,最先插入的元素將是最先被刪除的元素;反
迴圈佇列(順序表實現,連結串列實現)
迴圈佇列 迴圈佇列是將順序佇列變為一個變成一個環狀的空間。頭尾指標以及佇列元素之間的關係不變,只是在迴圈佇列中,頭尾指標“依環狀增 1”的操作可用”模“運算來實現。通過取模運算,頭指標和尾指標就可以在順序表空間內以頭尾銜接的方式迴圈移動。 隊空條件:Q.front == Q.rear
《大話資料結構4》—— 佇列的順序儲存結構 (迴圈佇列)—— C++程式碼實現
佇列 ● 佇列的概念: 佇列(簡稱作隊,Queue)也是一種特殊的線性表,佇列的資料元素以及資料元素間的邏輯關係和線性表完全相同,其差別是線性表允許在任意位置插入和刪除,而佇列只允許在其一端進行插入操作在其另一端進行刪除操作。 佇
資料結構實驗4:C++實現迴圈佇列
實驗4 4.1 實驗目的 熟練掌握佇列的順序儲存結構和鏈式儲存結構。 熟練掌握佇列的有關演算法設計,並在迴圈順序佇列和鏈佇列上實現。 根據具體給定的需求,合理設計並實現相關結構和演算法。 4.2 實驗要求 4.2.1 迴圈順序佇列的實驗要求 迴圈順序佇列結構和運算定義,演算法的實現以庫檔案方式實
資料結構實現(四):迴圈佇列(C++版)
資料結構實現(四):迴圈佇列(C++版) 1. 概念及基本框架 2. 基本操作程式實現 2.1 入隊操作 2.2 出隊操作 2.3 查詢操作 2.4 其他操作 3. 演算法複雜度分析 3.1 入
資料結構與演算法分析c語言描述(Mark Allen)--迴圈佇列ADT陣列實現
迴圈佇列ADT陣列實現 使用陣列儲存 操作集合 入隊 出隊 清空 初始化 返回隊前元素 列印 重點注意! 對於一個迴圈佇列 front == rear時候佇列
佇列及迴圈佇列(Java實現)
package ch03; /* * 佇列類 */ public class MyQueue { // 底層實現是一個數組 private long[] arr; // 有效資料大小 private int elements; // 隊頭 priva
[Golang] struct配合slice實現迴圈佇列
迴圈佇列 特徵 使用的頭尾索引永遠都在底層陣列長度下標範圍內,如佇列長度為10,那麼底層陣列長度為11,index範圍[0,10] 解決的問題 用非迴圈陣列實現的佇列在底層陣列滿的時候有資料搬移的操作,會影響入隊操作;迴圈
C++ 迴圈佇列基本演算法實現
C++ 迴圈佇列基本演算法實現 #ifndef CircleQueue_h #define CircleQueue_h const int QueueSize = 1000; template <class T> class CircleQueue { public: Circl
java迴圈佇列的實現
原始碼的github地址,可以下載到本地執行 package impl; import Interface.IQueue; /** * 迴圈佇列 * <p> * 注意:判空和判滿的兩種情況: * 情況1.另設一個標識位區別佇列是空還是滿 * 情況2.少用一個
軟考:資料結構基礎——迴圈佇列C語言實現
迴圈佇列得實現: 1. 在入隊和出隊時,我們通過 q->rear = (q->rear +1)%MAX_LENTH 來實現迴圈入隊 q