wolffd@0: classdef CStack < handle wolffd@0: % CStack define a stack data strcuture wolffd@0: % wolffd@0: % It likes java.util.Stack, however, it could use CStack.content() to wolffd@0: % return all the data (in cells) of the Stack, and it is a litter faster wolffd@0: % than java's Stack. wolffd@0: % wolffd@0: % s = CStack(c); c is a cells, and could be omitted wolffd@0: % s.size() return the numble of element wolffd@0: % s.isempty() return true when the stack is empty wolffd@0: % s.empty() delete the content of the stack wolffd@0: % s.push(el) push el to the top of stack wolffd@0: % s.pop() pop out the top of the stack, and return the element wolffd@0: % s.top() return the top element of the stack wolffd@0: % s.remove() remove all the elements in the stack wolffd@0: % s.content() return all the data of the stack (in the form of a wolffd@0: % cells with size [s.size(), 1] wolffd@0: % wolffd@0: % See also CList, CQueue wolffd@0: % wolffd@0: % Copyright: zhang@zhiqiang.org, 2010. wolffd@0: % url: http://zhiqiang.org/blog/it/matlab-data-structures.html wolffd@0: wolffd@0: properties (Access = private) wolffd@0: buffer % 一个cell数组,保存栈的数据 wolffd@0: cur % 当前元素位置, or the length of the stack wolffd@0: capacity % 栈的容量,当容量不够时,容量扩充为2倍。 wolffd@0: end wolffd@0: wolffd@0: methods wolffd@0: function obj = CStack(c) wolffd@0: if nargin >= 1 && iscell(c) wolffd@0: obj.buffer = c(:); wolffd@0: obj.cur = numel(c); wolffd@0: obj.capacity = obj.cur; wolffd@0: elseif nargin >= 1 wolffd@0: obj.buffer = cell(100, 1); wolffd@0: obj.cur = 1; wolffd@0: obj.capacity =100; wolffd@0: obj.buffer{1} = c; wolffd@0: else wolffd@0: obj.buffer = cell(100, 1); wolffd@0: obj.capacity = 100; wolffd@0: obj.cur = 0; wolffd@0: end wolffd@0: end wolffd@0: wolffd@0: function s = size(obj) wolffd@0: s = obj.cur; wolffd@0: end wolffd@0: wolffd@0: function remove(obj) wolffd@0: obj.cur = 0; wolffd@0: end wolffd@0: wolffd@0: function b = empty(obj) wolffd@0: b = obj.cur; wolffd@0: obj.cur = 0; wolffd@0: end wolffd@0: wolffd@0: function b = isempty(obj) wolffd@0: b = ~logical(obj.cur); wolffd@0: end wolffd@0: wolffd@0: function push(obj, el) wolffd@0: if obj.cur >= obj.capacity wolffd@0: obj.buffer(obj.capacity+1:2*obj.capacity) = cell(obj.capacity, 1); wolffd@0: obj.capacity = 2*obj.capacity; wolffd@0: end wolffd@0: obj.cur = obj.cur + 1; wolffd@0: obj.buffer{obj.cur} = el; wolffd@0: end wolffd@0: wolffd@0: function el = top(obj) wolffd@0: if obj.cur == 0 wolffd@0: el = []; wolffd@0: warning('CStack:No_Data', 'trying to get top element of an emtpy stack'); wolffd@0: else wolffd@0: el = obj.buffer{obj.cur}; wolffd@0: end wolffd@0: end wolffd@0: wolffd@0: function el = pop(obj) wolffd@0: if obj.cur == 0 wolffd@0: el = []; wolffd@0: warning('CStack:No_Data', 'trying to pop element of an emtpy stack'); wolffd@0: else wolffd@0: el = obj.buffer{obj.cur}; wolffd@0: obj.cur = obj.cur - 1; wolffd@0: end wolffd@0: end wolffd@0: wolffd@0: function display(obj) wolffd@0: if obj.cur wolffd@0: for i = 1:obj.cur wolffd@0: disp([num2str(i) '-th element of the stack:']); wolffd@0: disp(obj.buffer{i}); wolffd@0: end wolffd@0: else wolffd@0: disp('The stack is empty'); wolffd@0: end wolffd@0: end wolffd@0: wolffd@0: function c = content(obj) wolffd@0: c = obj.buffer(1:obj.cur); wolffd@0: end wolffd@0: end wolffd@0: end