Как реализовать стек и очередь в JavaScript?

Вот три интересных способа

  1. Чтение по спирали можно рассматривать как змею, движущуюся к границе и включающую попадание границы или себя (я нахожу ее элегантной и наиболее эффективной, будучи одиночный цикл из N итераций)
    ar = [
         [ 0,  1,  2,  3, 4],
         [15, 16, 17, 18, 5],
         [14, 23, 24, 19, 6],
         [13, 22, 21, 20, 7],
         [12, 11, 10, 9, 8]]
    
    def print_spiral(ar):
        """
        assuming a rect array
        """
        rows, cols = len(ar), len(ar[0])
        r, c = 0, -1 # start here
        nextturn = stepsx = cols # move so many steps
        stepsy = rows-1
        inc_c, inc_r = 1, 0 # at each step move this much
        turns = 0 # how many times our snake had turned
        for i in range(rows*cols):
            c += inc_c
            r += inc_r 
    
            print ar[r][c],
    
            if i == nextturn-1:
                turns += 1
                # at each turn reduce how many steps we go next
                if turns%2==0:
                    nextturn += stepsx
                    stepsy -= 1
                else:
                    nextturn += stepsy
                    stepsx -= 1
                # change directions
                inc_c, inc_r = -inc_r, inc_c  
    
    print_spiral(ar)
    

output:

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
  1. Рекурсивным подходом было бы напечатать внешний слой и вызвать ту же функцию для внутреннего прямоугольник, например
    def print_spiral(ar, sr=0, sc=0, er=None, ec=None):
        er = er or len(ar)-1
        ec = ec or len(ar[0])-1
    
        if sr > er or sc > ec:
            print
            return
    
        # print the outer layer
        top, bottom, left, right = [], [], [], []
        for c in range(sc,ec+1):
            top.append(ar[sr][c])
            if sr != er:
                bottom.append(ar[er][ec-(c-sc)])
    
        for r in range(sr+1,er):
            right.append(ar[r][ec])
            if ec != sc:
                left.append(ar[er-(r-sr)][sc])
    
        print " ".join([str(a) for a in top + right + bottom + left]),
    
        # peel next layer of onion
        print_spiral(ar, sr+1, sc+1, er-1, ec-1)
    

Наконец, вот небольшой фрагмент, чтобы сделать это, но не эффективно, но весело :), в основном он печатает верхний ряд и вращает весь прямоугольник против часовой стрелки и повторяет

def print_spiral(ar):
    if not ar: return
    print " ".join(str(a) for a in ar[0]),
    ar = zip(*[ reversed(row) for row in ar[1:]])
    print_spiral(ar)
655
задан KingNestor 19 October 2009 в 18:15
поделиться

5 ответов

var stack = [];
stack.push(2);       // stack is now [2]
stack.push(5);       // stack is now [2, 5]
var i = stack.pop(); // stack is now [2]
alert(i);            // displays 5

var queue = [];
queue.push(2);         // queue is now [2]
queue.push(5);         // queue is now [2, 5]
var i = queue.shift(); // queue is now [5]
alert(i);              // displays 2

taken from "9 javascript tips you may not know"

1243
ответ дан 22 November 2019 в 21:42
поделиться

Создайте пару классов, которые предоставляют различные методы, которые есть у каждой из этих структур данных (push, pop, peek и т. Д.). Теперь реализуем методы. Если вы знакомы с концепциями стека / очереди, это должно быть довольно просто. Вы можете реализовать стек с массивом и очередь со связанным списком, хотя, безусловно, есть другие способы сделать это. Javascript упростит это, потому что он слабо типизирован, поэтому вам даже не нужно беспокоиться об общих типах, что вам пришлось бы делать, если бы вы реализовывали его на Java или C #.

0
ответ дан 22 November 2019 в 21:42
поделиться

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

Проверьте эту ссылку, чтобы узнать, как чтобы массив действовал как очередь:

Queues

2
ответ дан 22 November 2019 в 21:42
поделиться

Массивы.

Стек:

var stack = [];

//put value on top of stack
stack.push(1);

//remove value from top of stack
var value = stack.pop();

Очередь:

var queue = [];

//put value on end of queue
queue.push(1);

//Take first value from queue
var value = queue.shift();
65
ответ дан 22 November 2019 в 21:42
поделиться

Javascript имеет методы push и pop, которые работают с обычными объектами массива Javascript.

Для очередей смотрите здесь:

http://safalra.com/web-design/javascript/queues/

Очереди могут быть реализованы в JavaScript с использованием push и методы shift или unshift и pop методы объекта массива. Хотя это простой способ реализовать очередей, это очень неэффективно для большие очереди - потому что методы работают с массивами, сдвиг и методы unshift перемещают каждый элемент в массив каждый раз, когда они вызываются.

Queue.js - это простая и эффективная реализация очереди для JavaScript, функция удаления из очереди которой выполняется за амортизированное постоянное время. В результате для больших очередей это может быть значительно быстрее, чем использование массивов.

80
ответ дан 22 November 2019 в 21:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: