Matlab: как добавить метод, переворачивающий буферный стек? - PullRequest
0 голосов
/ 09 мая 2020

Как я могу добавить в реализацию CStack метод, обращающий буфер со следующим объявлением: function reverse (obj) Метод должен изменить порядок элементов в стеке.

Например, если изначально стек содержал следующие элементы: 16 5 9 4 2? ? ? Затем, после применения обратной функции, он должен содержать элементы: 2 4 9 5 16? ? ?

classdef CStack < handle
        %   s = CStack(c);  c is a cell, and could be omitted
        %   s.size()        returns the numbre of elements
        %   s.isempty()     returns true when the stack is empty
        %   s.empty()       deletes the content of the stack
        %   s.push(el)      pushes el to the top of stack
        %   s.pop()         pops out the top of the stack, and returns the element
        %   s.top()         returns the top element of the stack
        %   s.remove()      removes all the elements in the stack
        %   s.content()     returns all the data of the stack (in the form of a cell with size [s.size(), 1]
        %
        % Copyright: zhang@zhiqiang.org, 2010.
        % url: http://zhiqiang.org/blog/it/matlab-data-structures.html

        properties (Access = private)
            buffer;
            cur;
            capacity;
        end

        methods

            function obj = CStack(c)
                if nargin >= 1 && iscell(c)
                    obj.buffer = c(:);
                    obj.cur = numel(c);
                    obj.capacity = obj.cur;
                elseif nargin >= 1
                    obj.buffer = cell(100, 1);
                    obj.cur = 1;
                    obj.capacity =100;
                    obj.buffer{1} = c;
                else
                    obj.buffer = cell(100, 1);
                    obj.capacity = 100;
                    obj.cur = 0;
                end
            end

            function s = size(obj)
                s = obj.cur;
            end

            function remove(obj)
                obj.cur = 0;
            end

            function b = empty(obj)
                b = obj.cur;
                obj.cur = 0;
            end

            function b = isempty(obj)
                b = ~logical(obj.cur);
            end

            function push(obj, el)
                if obj.cur >= obj.capacity
                    obj.buffer(obj.capacity+1:2*obj.capacity) = cell(obj.capacity, 1);
                    obj.capacity = 2*obj.capacity;
                end
                obj.cur = obj.cur + 1;
                obj.buffer{obj.cur} = el;
            end

            function el = top(obj)
                if obj.cur == 0
                    el = [];
                    warning('CStack:No_Data', 'trying to get top element of an emtpy stack');
                else
                    el = obj.buffer{obj.cur};
                end
            end

            function el = pop(obj)
                if obj.cur == 0
                    el = [];
                    warning('CStack:No_Data', 'trying to pop element of an emtpy stack');
                else
                    el = obj.buffer{obj.cur};
                    obj.cur = obj.cur - 1;
                end
            end

            function disp(obj)
                if obj.cur
                    for i = 1:obj.cur
                        disp([num2str(i) '-th element of the stack:']);
                        disp(obj.buffer{i});
                    end
                else
                    disp('The stack is empty');
                end
            end

            function c = content(obj)
                c = obj.buffer(1:obj.cur);
            end


              function reverse(obj)


              obj.buffer(1:obj.capacity) = fliplr(obj.buffer(1:obj.capacity));


              end
        end 
    end

I would appreciate any tips on how to fix my code. Thanks in advance. 

проверка кода с помощью:

s1 = CStack({1,2,3,'GGG'}); 
s1.reverse(); disp('----'); disp(s1); 
s1.push(5);  
s1.reverse(); disp('----'); disp(s1); 
s1.empty(); disp('----'); 
s1.reverse(); disp(s1);

ожидаемый результат:

---- 1-th element of the stack:
 GGG 
2-th element of the stack:     
 3 
3-th element of the stack:      
2
4-th element of the stack: 
     1
 ---- 1-th element of the stack:    
  5
 2-th element of the stack:
      1 
3-th element of the stack:  
    2 
4-th element of the stack:     
 3 
5-th element of the stack: 
GGG 
---- The stack is empty 

1 Ответ

1 голос
/ 09 мая 2020

Легко, используйте переворот влево-вправо (fliplr) и базовую c индексацию.

a=[1:10];
length=5;
a(1:length)=fliplr(a(1:length));

Я предполагал, что вы хотите перевернуть только некоторые элементы (из-за вашего примера, содержащего завершающие? ? ?? ??), но если вы хотите перевернуть весь массив, вам просто нужно

a=fliplr(a);

Я оставлю вам, как добавить это в ваш класс.

ПРИМЕЧАНИЕ : это работает для горизонтальных массивов / ячеек. Очевидно, замените fliplr на его вертикальную версию flipud, если у вас есть вертикальные массивы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...