Skip to content

feat(queue): queue implementation #2

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jan 7, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions src/queue/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# 队列

在计算机科学中, 一个 **队列(queue)** 是一种特殊类型的抽象数据类型或集合。集合中的实体按顺序保存。

队列基本操作有两种: 向队列的后端位置添加实体,称为入队,并从队列的前端位置移除实体,称为出队。

队列中元素先进先出 FIFO (first in, first out)
99 changes: 99 additions & 0 deletions src/queue/__tests__/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
import { Queue } from '../index'

describe("Queue", () => {
it("should create an empty queue", () => {
const queue = new Queue();
expect(queue).not.toBeNull();
expect(queue.length).toBe(0);
})

it("should enqueue data to queue", () => {
const queue = new Queue()
queue.enqueue(1)
queue.enqueue(2)
expect(queue.toString()).toBe('1,2')
})

it("should have length for queue correctly", () => {
const queue = new Queue();
expect(queue.length).toBe(0);
queue.enqueue(1)
queue.enqueue(2)
expect(queue.length).toBe(2);
})

it("should dequeue from queue in FIFO order", () => {
const queue = new Queue()
queue.enqueue(1)
queue.enqueue(2)

expect(queue.dequeue()).toBe(1);
expect(queue.length).toBe(1)
expect(queue.toString()).toBe('2')

expect(queue.dequeue()).toBe(2);
expect(queue.length).toBe(0)
expect(queue.toString()).toBe('')
})

it("should enqueue/dequeue any data to/from queue", () => {
const queue = new Queue()

const valueTest = [
{a: "test", b: 123},
[],
() => {/** */}
]

valueTest.forEach((item) => {
queue.enqueue(item)
})

expect(queue.length).toBe(valueTest.length)
expect(queue.toString()).toEqual(valueTest.toString())

valueTest.forEach((item) => {
queue.dequeue()
})

expect(queue.length).toBe(0)
expect(queue.toString()).toEqual('')
})

it("should return isEmpty for queue", () => {
const queue = new Queue();
expect(queue.isEmpty()).toBeTruthy();
queue.enqueue(1)
queue.enqueue(2)
expect(queue.isEmpty()).toBeFalsy()
})

it("should return length for queue correctly", () => {
const queue = new Queue();
expect(queue.isEmpty()).toBeTruthy();
queue.enqueue(1)
queue.enqueue(2)
expect(queue.isEmpty()).toBeFalsy()
})

it("should peek item from queue", () => {
const queue = new Queue();

expect(queue.peek()).toBe(null);

queue.enqueue(1)
queue.enqueue(2)

expect(queue.peek()).toBe(1);
expect(queue.peek()).toBe(1);

queue.dequeue()

expect(queue.peek()).toBe(2);

queue.dequeue()

expect(queue.peek()).toBe(null);
expect(queue.peek()).toBe(null);
})
})
41 changes: 41 additions & 0 deletions src/queue/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
/**
* 数组版本的队列
*/

export class Queue {
private list: any[] = [];

constructor() {
this.list = [];
}

get length() {
return this.list.length;
}

isEmpty() {
return this.list.length === 0;
}

enqueue(item: any) {
this.list.push(item);
}

dequeue() {
if(this.list.length === 0) {
return null;
}
return this.list.shift();
}

/**
* 查看首个节点
*/
peek() {
return this.list.length > 0 ? this.list[0] : null;
}

toString() {
return this.list.toString();
}
}