자바 스크립트 --- 큐 학습

대기열은 일종의 목록입니다. 차이점은 대기열이 대기열 끝에 요소를 삽입하고 대기열 시작 부분에 요소를 삭제할 수 있다는 것입니다.

큐는 선입 선출 순서로 정렬 된 데이터를 저장하는 데 사용됩니다. 이것은 스택과 다릅니다. 스택에서는 스택의 마지막 요소가 먼저 처리됩니다.

큐는 선입 선출 (선입 선출, FIFO) 데이터 구조입니다.

대기열은 운영 체제에서 실행되는 일련의 프로세스 제출, 작업 풀 인쇄 등과 같은 여러 위치에서 사용됩니다. 일부 시뮬레이션 시스템은 대기열을 사용하여 은행이나 식료품 점에서 대기중인 고객을 시뮬레이션합니다.

1 대기열 작업

큐의 두 가지 주요 작업은 큐에 새 요소를 삽입하고 큐에서 요소를 삭제하는 것입니다. 대기열에 넣기 및 대기열에서 빼기라고도합니다.

큐의 또 다른 중요한 작업은 큐의 헤드에있는 요소를 읽는 것입니다. 이 작업을 peek ()라고합니다. 이 작업은 대기열의 헤드를 반환하지만 대기열에서 제거하지는 않습니다.

 

2 배열로 구현 된 대기열

function Queue() {
    this.dataStore = [];
    this.enqueue = enqueue;
    this.dequeue = dequeue;
    this.front = front;
    this.back = back;
    this.toString = toString;
    this.empty = empty;
}
// 向队尾添加一个元素enqueue
function enqueue(element) {
    this.dataStore.push(element)
}
// 删除对首的元素
function dequeue() {
    return this.dataStore.shift()
}
// 读取队首
function front() {
    return this.dataStore[0]
}
// 队尾的元素
function back() {
    return this.dataStore[this.dataStore.length - 1]
}
// 显示队列内的所有元素
function toString() {
    var retStr = "";
    for (var i = 0; i < this.dataStore.length; ++i) {
        retStr += this.dataStore[i] + "\n";
    }
    return retStr;
}
// 判断队列是否为空
function empty() {
    if (this.dataStore.length == 0) {
        return true;
    }
    else {
        return false;
    }
}

 

 

스퀘어 댄스 시뮬레이션

function Queue() {
    this.dataStore = [];
    this.enqueue = enqueue;
    this.dequeue = dequeue;
    this.front = front;
    this.back = back;
    this.toString = toString;
    this.empty = empty;
    this.count = count;
}
// 向队尾添加一个元素enqueue
function enqueue(element) {
    this.dataStore.push(element)
}
// 删除对首的元素
function dequeue() {
    return this.dataStore.shift()
}
// 读取队首
function front() {
    return this.dataStore[0]
}
// 队尾的元素
function back() {
    return this.dataStore[this.dataStore.length - 1]
}
// 显示队列内的所有元素
function toString() {
    var retStr = "";
    for (var i = 0; i < this.dataStore.length; ++i) {
        retStr += this.dataStore[i] + "\n";
    }
    return retStr;
}
// 判断队列是否为空
function empty() {
    if (this.dataStore.length == 0) {
        return true;
    }
    else {
        return false;
    }
}
// 显示元素的个数
function count() {
    return this.dataStore.length;
}

// var q = new Queue();
// q.enqueue("Meredith");
// q.enqueue("Cynthia");
// q.enqueue("Jennifer");
// print(q.toString());
// q.dequeue();
// print(q.toString());
// print("Front of queue: " + q.front());
// print("Back of queue: " + q.back());

// 方块舞
// 舞者的姓名被从文件读入数组。然后 trim() 函数除去了每行字符串后的空格
// 。第二个循环将 每行字符串按性别和姓名分成两部分存入一个数组。然后根据性别,将舞者加入不同的队列。
function Dancer(name, sex) {
    this.name = name;
    this.sex = sex;
}
function getDancers(males, females) { // 读取信息
    var names = read('dancers.txt').split("\n");
    for (var i = 0; i < names.length; i++) {
        names[i] = names[i].trim();
    }
    for (var i = 0; i < names.length; ++i) {
        var dancer = names[i].split(" ");
        var sex = dancer[0];
        var name = dancer[1];
        if (sex == "F") {
            females.enqueue(new Dancer(name, sex));
        }
        else {
            males.enqueue(new Dancer(name, sex));
        }
    }
}

function dance(males, females) {  // 进行匹配
    print("The dance partners are: \n");
    while (!females.empty() && !males.empty()) {
        person = females.dequeue();
        putstr("Female dancer is: " + person.name);
        person = males.dequeue();
        print("--------------and the male dancer is: " + person.name);
    }
    print();
}

var maleDancers = new Queue();
var femaleDancers = new Queue();
getDancers(maleDancers, femaleDancers);
dance(maleDancers, femaleDancers);
if (maleDancers.count() > 0) {
    print("There are " + maleDancers.count() + " male dancers waiting to dance.");
}
if (femaleDancers.count() > 0) {
    print("There are " + femaleDancers.count() + " female dancers waiting to dance.");
}

 

큐를 사용하여 데이터 정렬

 

대기열은 대기열과 관련된 실제 작업을 수행하는 데 사용될뿐만 아니라 데이터를 정렬하는데도 사용될 수 있습니다. 컴퓨터가 처음 등장했을 때 프로그램은 펀치 카드를 통해 호스트에 입력되었으며 각 카드에는 프로그램 설명이 포함되어 있습니다. 이 펀치 카드는 상자에 포장되어 기계 장치로 분류됩니다. 큐 세트를 사용하여이 프로세스를 시뮬레이션 할 수 있습니다. 이 정렬 기술을 카디널리티 정렬이라고 합니다. C ++를 사용한 데이터 구조 (Prentice Hall) 책을 참조하십시오. 가장 빠른 정렬 알고리즘은 아니지만 대기열을 사용하는 몇 가지 흥미로운 방법을 보여줍니다.

 

기본 정렬

0부터 99까지의 숫자 기준 정렬

// 使用队列代表盒子,可以实现这个算法。我们需要九个队列,每个对应一个数字。将所有 队列保存在一个数组中,使用取余和除法操作决定个位和十位。算法的剩余部分将数字加 入相应的队列,根据个位数值对其重新排序,然后再根据十位上的数值进行排序,结果即 为排好序的数字。
// 下面是根据相应位(个位或十位)上的数值,将数字分配到相应队列的函数
function distribute(nums, queues, n, digit) {  参数 digit 表示个位或十位上的值
    for (var i = 0; i < n; ++i) {
        if (digit == 1) {
            queues[nums[i] % 10].enqueue(nums[i]);
        }
        else {
            queues[Math.floor(nums[i] / 10)].enqueue(nums[i]);
        }
    }
}
function collect(queues, nums) {
    var i = 0;
    for (var digit = 0; digit < 10; ++digit) {
        while (!queues[digit].empty()) {
            nums[i++] = queues[digit].dequeue();
        }
    }
}
function dispArray(arr) {
    for (var i = 0; i < arr.length; ++i) {
        putstr(arr[i] + " ");
    }
}

var queues = [];
for (var i = 0; i < 10; ++i) {
    queues[i] = new Queue();
}
var nums = [];
for (var i = 0; i < 10; ++i) {
    nums[i] = Math.floor(Math.floor(Math.random() * 101));
}
print("Before radix sort: ");
dispArray(nums);
distribute(nums, queues, 10, 1);
collect(queues, nums);
distribute(nums, queues, 10, 10);
collect(queues, nums);
print("\n\nAfter radix sort: ");
dispArray(nums);
다음은 프로그램을 여러 번 실행 한 결과입니다.
     기수 정렬 전 : 
     45 72 93 51 21 16 70 41 27 31
     기수 정렬 후 : 
     16 21 27 31 41 45 51 70 72 93
     기수 정렬 전 : 
     76 77 15 84 79 71 69 99 6 54
     기수 정렬 후 : 
     6 15 54 69 71 76 77 79 84 99

 우선 순위 대기열

일반적으로 큐에서 삭제 된 요소는 큐에 들어가는 첫 번째 요소 여야합니다. 그러나 요소를 삭제할 때 선입 선출 규칙을 준수 할 필요가없는 큐를 사용하는 일부 애플리케이션도 있습니다. 이러한 종류의 응용 프로그램은 시뮬레이션을 위해 우선 순위 대기열이라는 데이터 구조를 사용해야합니다.

function Queue() {
    this.dataStore = [];
    this.enqueue = enqueue;
    this.dequeue = dequeue;
    this.front = front;
    this.back = back;
    this.toString = toString;
    this.empty = empty;
    this.count = count;
}
// 向队尾添加一个元素enqueue
function enqueue(element) {
    this.dataStore.push(element)
}
// 删除对首的元素
// function dequeue() {
//     return this.dataStore.shift()
// }
//dequeue() 方法使用简单的顺序查找方法寻找优先级最高的元素(优先码越小优先级越高, 比如,1 比 5 的优先级高)。该方法返回包含一个元素的数组——从队列中删除的元素。
function dequeue() {
    var priority = this.dataStore[0].code;
    for (var i = 1; i < this.dataStore.length; ++i) {
        if (this.dataStore[i].code < priority) {
            priority = i;
        }
    }
    return this.dataStore.splice(priority, 1);
}

// 读取队首
function front() {
    return this.dataStore[0]
}
// 队尾的元素
function back() {
    return this.dataStore[this.dataStore.length - 1]
}
// 显示队列内的所有元素
// function toString() {
//     var retStr = "";
//     for (var i = 0; i < this.dataStore.length; ++i) {
//         retStr += this.dataStore[i] + "\n";
//     }
//     return retStr;
// }
function toString() {
    var retStr = "";
    for (var i = 0; i < this.dataStore.length; ++i) {
        retStr += this.dataStore[i].name + " code: " + this.dataStore[i].code + "\n";
    }
    return retStr;
}
// 判断队列是否为空
function empty() {
    if (this.dataStore.length == 0) {
        return true;
    }
    else {
        return false;
    }
}
// 显示元素的个数
function count() {
    return this.dataStore.length;
}

function Patient(name, code) {
    this.name = name;
    this.code = code;
}

var p = new Patient("Smith", 5);
var ed = new Queue();
ed.enqueue(p);
p = new Patient("Jones", 4);
ed.enqueue(p);

p = new Patient("Fehrenbach", 6);
ed.enqueue(p);
p = new Patient("Brown", 1);
ed.enqueue(p);
p = new Patient("Ingram", 1);
ed.enqueue(p);
print(ed.toString());
var seen = ed.dequeue();
print("Patient being treated: " + seen[0].name);
print("Patients waiting to be")
print(ed.toString());

// 下一轮
var seen = ed.dequeue();
print("Patient being treated: " + seen[0].name);
print("Patients waiting to be seen :")
print(ed.toString())
// 输出
// Smith code: 5
// Jones code: 4
// Fehrenbach code: 6
// Brown code: 1
// Ingram code: 1

// Patient being treated: Jones
// Patients waiting to be
// Smith code: 5
// Fehrenbach code: 6
// Brown code: 1
// Ingram code: 1

// Patient being treated: Ingram
// Patients waiting to be seen:
// Smith code: 5
// Fehrenbach code: 6
// Brown code: 1

 

요약 : 우선 순위 대기열은 약간 혼란스럽고 연습을 완료 한 후 검토하고 작성하겠습니다.

 

 

 

 

 

 

추천

출처blog.csdn.net/wanghongpu9305/article/details/110187860