我正在使用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函数也返回一个错误,我迷失了原因。感谢
答案 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