2016-06-02 3 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 

현재, 디큐 기능은 오히려 완전히 세포를 제거하는 것보다, 빈 셀을 떠난다. 이것이 피할 수 있습니까? 또한 searchQueue 함수는 오류를 반환하고 나는 그 이유를 놓치게됩니다. 감사합니다

답변

1

여기 matlab의 객체 지향 기능을 사용하여 거친 첫 번째 상처가 있어요. 클래스를 생성하는 이유는 dequeue/enqueue 함수가 셀 배열을 직접 수정하여 재 할당의 필요성을 없애기 위해 핸들 유형에서 참조 시맨틱을 얻는 것입니다.

아래의 코드 예제는 빈 셀을 남기지 않고 대기열에서 빼는 방법에 대한 주요 질문에 대한 답변입니다 (동일한 효과에 대한 OOP 방식없이 사용할 수 있음). == 문자열의 크기가 일치하면 isequal()을 사용하고 싶었 반면)가있는 경우 실패 자 (비교하기 때문에 1) 비교 q{i} == item 당신에게 문제를 제공합니다;

는 검색 뭐가 잘못에 대한 귀하의 질문에 대답하려면 2) fprintf 대신 sprintf을 원했습니다. 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