Mercurial > hg > camir-aes2014
diff core/tools/CQueue.m @ 0:e9a9cd732c1e tip
first hg version after svn
author | wolffd |
---|---|
date | Tue, 10 Feb 2015 15:05:51 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/core/tools/CQueue.m Tue Feb 10 15:05:51 2015 +0000 @@ -0,0 +1,160 @@ +classdef CQueue < handle +% CQueue define a queue data strcuture +% +% It likes java.util.Queue, however, it could use CQueue.content() to +% return all the data (in cells) of the Queue, and it is a litter faster +% than java's Queue. +% +% q = CQueue(c); c is a cells, and could be omitted +% s.size() return the numble of element +% s.isempty() return true when the queue is empty +% s.empty() delete all the elements in the queue. +% s.push(el) push el to the top of qeueu +% s.pop() pop out the the beginning of queue, and return the element +% s.front() return the the the beginning element of the qeueu +% s.back() return the the the rear element of the qeueu +% s.remove() remove all data from the queue +% s.content() return all the data of the queue (in the form of a +% cells with size [s.size(), 1] +% +% See also CList, CStack +% Copyright: zhang@zhiqiang.org, 2010. +% url: http://zhiqiang.org/blog/it/matlab-data-structures.html + + properties (Access = private) + buffer % a cell, to maintain the data + beg % the start position of the queue + rear % the end position of the queue + % the actually data is buffer(beg:rear-1) + end + + properties (Access = public) + capacity % 栈的容量,当容量不够时,容量扩充为2倍。 + end + + methods + function obj = CQueue(c) % 初始化 + if nargin >= 1 && iscell(c) + obj.buffer = [c(:); cell(numel(c), 1)]; + obj.beg = 1; + obj.rear = numel(c) + 1; + obj.capacity = 2*numel(c); + elseif nargin >= 1 + obj.buffer = cell(100, 1); + obj.buffer{1} = c; + obj.beg = 1; + obj.rear = 2; + obj.capacity = 100; + else + obj.buffer = cell(100, 1); + obj.capacity = 100; + obj.beg = 1; + obj.rear = 1; + end + end + + function s = size(obj) % 队列长度 + if obj.rear >= obj.beg + s = obj.rear - obj.beg; + else + s = obj.rear - obj.beg + obj.capacity; + end + end + + function b = isempty(obj) % return true when the queue is empty + b = ~logical(obj.size()); + end + + function s = empty(obj) % clear all the data in the queue + s = obj.size(); + obj.beg = 1; + obj.rear = 1; + end + + function push(obj, el) % 压入新元素到队尾 + if obj.size >= obj.capacity - 1 + sz = obj.size(); + if obj.rear >= obj.front + obj.buffer(1:sz) = obj.buffer(obj.beg:obj.rear-1); + else + obj.buffer(1:sz) = obj.buffer([obj.beg:obj.capacity 1:obj.rear-1]); + end + obj.buffer(sz+1:obj.capacity*2) = cell(obj.capacity*2-sz, 1); + obj.capacity = numel(obj.buffer); + obj.beg = 1; + obj.rear = sz+1; + end + obj.buffer{obj.rear} = el; + obj.rear = mod(obj.rear, obj.capacity) + 1; + end + + function el = front(obj) % 返回队首元素 + if obj.rear ~= obj.beg + el = obj.buffer{obj.beg}; + else + el = []; + warning('CQueue:NO_DATA', 'try to get data from an empty queue'); + end + end + + function el = back(obj) % 返回队尾元素 + + if obj.rear == obj.beg + el = []; + warning('CQueue:NO_DATA', 'try to get data from an empty queue'); + else + if obj.rear == 1 + el = obj.buffer{obj.capacity}; + else + el = obj.buffer{obj.rear - 1}; + end + end + + end + + function el = pop(obj) % 弹出队首元素 + if obj.rear == obj.beg + error('CQueue:NO_Data', 'Trying to pop an empty queue'); + else + el = obj.buffer{obj.beg}; + obj.beg = obj.beg + 1; + if obj.beg > obj.capacity, obj.beg = 1; end + end + end + + function remove(obj) % 清空队列 + obj.beg = 1; + obj.rear = 1; + end + + function display(obj) % 显示队列 + if obj.size() + if obj.beg <= obj.rear + for i = obj.beg : obj.rear-1 + disp([num2str(i - obj.beg + 1) '-th element of the stack:']); + disp(obj.buffer{i}); + end + else + for i = obj.beg : obj.capacity + disp([num2str(i - obj.beg + 1) '-th element of the stack:']); + disp(obj.buffer{i}); + end + for i = 1 : obj.rear-1 + disp([num2str(i + obj.capacity - obj.beg + 1) '-th element of the stack:']); + disp(obj.buffer{i}); + end + end + else + disp('The queue is empty'); + end + end + + function c = content(obj) % 取出队列元素 + if obj.rear >= obj.beg + c = obj.buffer(obj.beg:obj.rear-1); + else + c = obj.buffer([obj.beg:obj.capacity 1:obj.rear-1]); + end + end + end +end \ No newline at end of file