2016-06-02 2 views
0

Я работаю над реализацией структур данных очереди с использованием ячеек массивов в Matlab. Я пытаюсь написать функции для продвижения очереди на один, а также поиск очереди для определенного элемента. На данный момент функция выглядит так (типы автомобилей - это пример данных).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

Вот грубая первая надпись на ней с использованием объектно-ориентированных возможностей Matlab. Причиной создания класса является получение ссылочной семантики из типа дескриптора, что позволяет функциям dequeue/enqueue напрямую изменять массив ячеек, устраняя необходимость переназначения.

Я считаю, что приведенный ниже пример кода отвечает на ваш основной вопрос о том, как удалить из очереди, не покидая пустую ячейку (можно использовать без подхода ООП к тому же эффекту).

Чтобы ответить на ваш вопрос о том, что случилось с поиском: 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 
Смежные вопросы