Вот три интересных способа
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
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)
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"
Создайте пару классов, которые предоставляют различные методы, которые есть у каждой из этих структур данных (push, pop, peek и т. Д.). Теперь реализуем методы. Если вы знакомы с концепциями стека / очереди, это должно быть довольно просто. Вы можете реализовать стек с массивом и очередь со связанным списком, хотя, безусловно, есть другие способы сделать это. Javascript упростит это, потому что он слабо типизирован, поэтому вам даже не нужно беспокоиться об общих типах, что вам пришлось бы делать, если бы вы реализовывали его на Java или C #.
Обычная структура массива в Javascript представляет собой стек (первый пришел, последний ушел) и также может использоваться в качестве очереди (первым пришел - первым ушел) в зависимости от выполняемых вами вызовов.
Проверьте эту ссылку, чтобы узнать, как чтобы массив действовал как очередь:
Массивы.
Стек:
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();
Javascript имеет методы push и pop, которые работают с обычными объектами массива Javascript.
Для очередей смотрите здесь:
http://safalra.com/web-design/javascript/queues/
Очереди могут быть реализованы в JavaScript с использованием push и методы shift или unshift и pop методы объекта массива. Хотя это простой способ реализовать очередей, это очень неэффективно для большие очереди - потому что методы работают с массивами, сдвиг и методы unshift перемещают каждый элемент в массив каждый раз, когда они вызываются.
Queue.js - это простая и эффективная реализация очереди для JavaScript, функция удаления из очереди которой выполняется за амортизированное постоянное время. В результате для больших очередей это может быть значительно быстрее, чем использование массивов.