コンセプトデータ構造両端キュー
デック(両端キューもいう)は、キューエントリの順序セットに似ています。これは、2つの端部、第一の部分と尾を持っており、コレクションに変更されていません。
両端キュー特別は、追加および削除項目を非限定的です。あなたは、前面または背面に新しい項目を追加することができます。同様に、既存のアイテムはいずれかの端部から除去することができます。ある意味では、ハイブリッド線形構造は、単一のスタックデータ構造と、すべてのキューの能力を提供します。
両端キュー抽象データ型定義:両端キューの抽象データ型以下の構造および動作によって定義されるべきです。どの追加し、頭や尾の両端から要素を削除することができます。両端キューは、以下の:
- Dqueは()新しい空の両端キューを作成します。これは、引数を取らず、空の両端キューを返します。
- lpush(アイテム)は両端キューのヘッダに新しい項目を追加します。これは、アイテムのパラメータが何も返されませんかかります。
- rpush(項目)は両端キューの末尾に新しいアイテムが追加されます。これは、アイテムのパラメータが何も返されませんかかります。
- 両端キュー内の最初の項目を削除するには()LPOP。これは、引数を取らず、アイテムを返します。両端キューが変更されます。
- RPOP()両端キューの末尾から項目を削除します。これは、引数を取らず、アイテムを返します。両端キューが変更されます。
- かどうかのisEmpty()テスト両端キューが空です。これは、引数を取りませんし、ブール値を返します。
- サイズは()両端キュー内の項目の数を返します。これは、パラメータを取らず、整数を返します。
定義されたデック
1クラスのDeque(オブジェクト):
2デフ__init __(自己):
3 self.deque = []
4
5 DEF __str __(自己):
6戻りSTR(self.deque)
7
8デフrpush(自己、項目):
9セルフ。 deque.append(アイテム)
10
11 DEF(自己、項目)lpush:
12 self.deque.insert(0アイテム)
13
14 DEF(自己)RPOP:
15戻りself.deque.pop()self.dequeそうであれば"デキューは空です!」
16
17 DEF(自己)LPOP:
self.deque他の場合は18戻りself.deque.popは(0) "デキューは空です!"
19
20 DEFのisEmpty(自己):
21戻りself.deque == []
22
23 DEFサイズ(自己):
24リターンLEN(self.deque)
両端キューアプリケーションケース - 回文検査
回文検出:設計手順は、文字列が回文であるかどうかを検出します。
-回文:回文は、例えば、同じ最初と最後の文字を文字列読んでいます
radar toot madam
。- 分析:この問題を解決するには、文字列を格納する両端キューを使用することです。私たちは、左から右に文字列を扱う、そして両端キューの最後に各文字を追加します。この時点で、通常のキューのように両端キュー。しかし、我々は今、デュアルファンクション両端キューを利用することができます。両端キューに格納されている最初の文字列の最初の部分は、両端キュー尾は最後の文字が保存されます。我々は、彼らが継続して一致した場合にのみ、最後の文字を削除して比較することができます。試合が続くと最後の文字ができれば、我々は、元の文字列の長さに応じて、文字を使い果たし、または両端キュー1の大きさを残してのいずれかで終わる偶数か奇数です。いずれの場合も、文字列が回文です。
1 from basic.deque import Deque 2 3 def palchecker(aString): 4 chardeque = Deque() 5 6 for ch in aString: 7 chardeque.addRear(ch) 8 9 stillEqual = True 10 11 while chardeque.size() > 1 and stillEqual: 12 first = chardeque.removeFront() 13 last = chardeque.removeRear() 14 if first != last: 15 stillEqual = False 16 17 return stillEqual 18 19 print(palchecker("lsdkjfskf")) 20 print(palchecker("radar"))