1. 程式人生 > >迴圈佇列的實現

迴圈佇列的實現

需求描述:實現一個固定長度的字元快取管理結構,實現字串的寫入和讀出。

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