Matlab - 队列数据结构

时间:2016-06-02 03:13:07

标签: matlab queue cell cell-array

我正在使用Matlab中的单元数组实现队列数据结构。我正在尝试编写函数以使队列前进一个,以及在队列中搜索特定项目。此功能看起来像这样(汽车类型是示例数据)。

function q = createQueue()

  q={};
  q = enqueue(q,'Hilux');
  q = enqueue(q,'E-Type');
  q = enqueue(q,'Beetle');
  q = enqueue(q,'Enzo');
  q = enqueue(q,'Boxter');
  q = dequeue(q)
  q = searchQueue(q,'Boxter')
end

% Adds an item to the end of the queue. Returns the new queue.
function q = enqueue(q,item)
    q{end+1} = item;
end


function [q item] = dequeue(q)
    q{1} = {};
    q{1} = q{2};
    q{2} = q{3};
    q{3} = q{4};
    q{4} = q{5};
    q{5} = {};
end

function answer = searchQueue(q, item)
    for i = 1:length(q)
        if q{i} == item
            answer = fprintf('FOUND AT INDEX %d',i);
            break
        else
            disp('-1')
       end
    end

end

目前,dequeue函数留下一个空单元格,而不是完全删除单元格。这是否可以避免? searchQueue函数也返回一个错误,我迷失了原因。感谢

1 个答案:

答案 0 :(得分:1)

这是使用matlab的面向对象功能进行粗略的第一次切割。创建类的原因是从句柄类型获取引用语义,这允许dequeue / enqueue函数直接修改单元格数组,从而无需重新分配。

我相信下面的代码示例回答了关于如何在不留空单元格的情况下出列的主要问题(可以在没有OOP方法的情况下使用相同的效果)。

回答你关于你的搜索有什么问题的问题:1)比较q{i} == item给你带来问题,因为==比较字符(如果字符串大小不匹配则会失败)而你想使用isequal(); 2)你想要sprintf而不是fprintf; 3)虽然没有严格错误,但循环中的else发生在每个不匹配的项目上,这可能不是你想要的。

classdef Queue < handle           
    properties
        data = {}
    end    
    methods
        function q = Queue()
            % TODO: do something in constructor if desired
        end    

        function item = dequeue(q)
            % TODO: bounds check
            item = q.data(1);
            q.data = q.data(2:end);
        end

        function enqueue(q,item)
            q.data{end+1} = item;
        end

        function answer = search(q, item)
            % TODO: check for multiple occurrences
            answer = 'NOT FOUND';
            for i = 1:length(q.data)
                if isequal(q.data{i},item)
                    answer = sprintf('FOUND AT INDEX %d',i);
                    break
                end
            end
        end
    end       
end