JSバージョンデータ構造_03サイクル・キュー
社説は、準備中のコードのテストが達成されています。しかし、白レベルを制限しました。そこには、あまりにも悪いと考えられています
この記事では、学びます。
- 循環キュー
- キュー関連のアプリケーション:回文チェック
1.キューの循環
循環キューいわゆるますが、キューは、通常のバリアントです。そのキューのサイズが固定されているので、論理リング構造を接続するように構成された包括的な一般的キューは、より簡単ダミーオーバーフローが発生することを防止することができます。
見てみましょう(まだ同じプライベートメンバ変数のレッスンをCHAP、または主要なアイデアを書き込み)、それを達成するために、
以下の機能:
- isEmptyは空宣告しました
- isFullフルセンテンス
- PUT(e)に尾栓
- テイクへのアンケート()チームのヘッド
また、空いている位置の内側にそれ:私が使用し、この循環キュー満杯状態を宣告しました。これは、最大位置が、私はそれがいっぱいです4を入れて5に設定されて入れているでしょう。主な目的は防ぐことで、無駄な条件で待っていた言い渡さ
class SqQueue {
constructor() {
this.front = 0;
this.rear = 0;
this.items = {};
this.MAX = 5; //这里我们人为规定此循环队列的长度为5
}
// 向队尾新加元素
put(e) {
// 先判满
if (this.isFull()) {
return "full";
} else {
this.items[this.rear] = e;
this.rear = (this.rear + 1) % this.MAX;//因为是个环所以不允许它有大于等于5的存在。环的指针下标在0-4.poll中同理
}
}
// 从对头取出元素
poll() {
// 先判空
if (this.isEmpty()) {
console.log(11);
return undefined;
} else {
const res = this.items[this.front];
delete this.items[this.front];
this.front = (this.front + 1) % this.MAX;
return res;
}
}
// 判空
isEmpty() {
return this.front === this.rear;
}
// 判满
isFull() {
// 采用的是此循环队列仅空余一个为满
return this.front == ((this.rear + 1) % this.MAX);
}
}
//部分测试代码:
let q = new SqQueue();
q.put(1);
q.put(2);
q.put(3);
q.put(4);
console.log(q.poll());
console.log(q.poll());
console.log(q.poll());
q.put(2);
q.put(3);
q.put(4);
console.log(q.poll());
console.log(q.poll());
console.log(q.poll());
console.log(q.poll());
q.put(4);
console.log(q);
アプリケーション:回文チェッカー
回文とは何ですか:回文は、正と負は、単語、フレーズ、番号や、奥様やレーシングカーなどの文字の列、一連の読むことができます。
多くのチェックがアルゴリズムはおそらく最も簡単に回文文字列方向の出力を見て、その後、元の文字列との比較を行うことである回文があります。おそらく最も簡単な(ここでは、サイクルをダウン使用とはみなされない)が、ここで両端キューの使用はスタックを使用してよりも簡単になります見ることの積み重ねです。
実装され
、彼らが直接使う場合は、クラスの両端キューに持つ
クラスの両端キューを
class Queue {
constructor() {
this.count = 0; //用于记录队列内的元素个数,也是用作指向队尾的指针
this.lowesCount = 0; //用于追踪对头元素的指针
this.items = {}; //用于存储队列元素的数据结构,当然也可以使用数组,但是使用对象获取元素更加高效
}
size() {
// 你要搞清楚有元素时这个this.count是指向的队尾的后一个,放的时候可是先放,再让它加的1
return this.count - this.lowesCount;
}
addFront(e) {
if (this.isEmpty()) {
this.addBack(e)
} else {
// 搞清楚现在谁指着队头呢
this.lowesCount--;
this.items[this.lowesCount] = e;
}
}
addBack(e) {
this.items[this.count] = e;
this.count++
}
removeFront() {
// 先判非空
if (this.isEmpty()) {
return undefined;
} else {
const result = this.items[this.lowesCount];
delete this.items[this.lowesCount];
// 指针后移
this.lowesCount++;
return result;
}
}
removeBack() {
if (this.isEmpty()) {
return undefined;
} else {
// 谁指向队尾呢,this.count指向的是队尾的下一个
let result = this.items[this.count - 1];
delete this.items[this.count - 1];
this.count--;
return result;
}
}
isEmpty() {
// 什么时候为空呢,这里希望你有写c的数据结构的基础,为空时队头队尾指针指向同一地方
return this.count === this.lowesCount;
}
}
達成するために回文検査方法:
function anagrams(s) {
// 对字符串做一些预处理
if (s === undefined || s === null || (s !== null && s.length == 0)) {
return false;
}
// 字母全变小写并去除空格,trim不可去除内部的
s = s.toLocaleLowerCase().split(" ").join("");
let q = new Queue();
let flag = true;
// 搞一个双端队列的实例
// 回文入队
for (let i = 0; i < s.length; i++) {
q.addBack(s.charAt(i));
}
// 两端出队的同时进行比较
while (q.size() > 1 && flag) {
let l = q.removeBack();
let r = q.removeFront();
if (l !== r) {
flag = false;
}
}
// q.size==1时肯定是个回文,就一个字符不用比较了就
return flag;
}