408 King's Road Data Structureクラス後コード演習(24)

創造を続け、成長を加速させましょう!「ナゲッツデイリーニュープラン・6月アップデートチャレンジ」に参加して2日目です。クリックしてイベントの詳細をご覧ください。

序文

23 King's Roadのデータ構造で放課後のすべてのコード演習の実装を更新する予定です。試験は通常擬似コードで記述されていますが、強迫観念の乱れのためにすべて実装しました。倉庫はここにあります。

コードはC++で記述されており、暴力的な解決策や可能な限り最適な解決策を含め、すべてをコンパイルして実行できます(試験時間が十分でない場合は、暴力的なものを直接攻撃でき、半分以上を取得できますポイントの)。

継続的な更新、現在の更新の進行状況:

  • 線形表14/14
  • リンクリスト25/25
  • スタック3/3
  • キュー4/4
  • スタックとキューの適用
  • ..。

参考まで!試験で書くことが許されていない文法があり、間違いがあるかもしれません。

3.2.6、1

image.png

  • チームが空です:Q.front == Q.rear && Q.tag == 0
  • チームフル:Q.front == Q.rear && Q.tag == 1
  • チームに入るだけでチームは満員になるので、チームに入るときはタグを1に設定し、チームを出るときも同様にタグを0に設定します。
bool enqueue(Queue &Q, int x) {
  if (Q.front == Q.rear && Q.tag == 1) {
    cout << "队列满" << endl;
    return false;
  }

  Q.data[Q.rear] = x;
  Q.rear = (Q.rear + 1) % maxsize;
  Q.tag = 1;
  return true;
}

bool dequeue(Queue &Q, int &x) {
  if (Q.front == Q.rear && Q.tag == 0) {
    cout << "队列空" << endl;
    return false;
  }

  x = Q.data[Q.front];
  Q.front = (Q.front + 1) % maxsize;
  Q.tag = 0;
  return true;
}
复制代码

2

image.png

  • チーム内の要素はデキューされ、スタックに1つずつプッシュされます。次に、すべての要素がスタックにプッシュされ、スタックから1つずつキューにプッシュされます。
  • 非常に簡単な質問は、「先入れ先出し」と「後入れ先出し」の性質を調べることです。
void reverseQueue(Queue &Q, Stack &S) {
  int x;
  while (!isEmpty(Q)) {
    dequeue(Q, x);
    push(S, x);
  }

  while (!isEmpty(S)) {
    pop(S, x);
    enqueue(Q, x);
  }
}
复制代码

3

image.png

  • S1のスタックは、キューに入るのに使用されます。S1がいっぱいで、S2が空の場合、S1の要素をS2に挿入できます。
  • S2のポップはキューとして使用されます。S2が空の場合は、S1のすべての要素をS2に挿入します。
  • 空は、両方のスタックが空であるかどうかを判断するだけで済みます
bool Enqueue(Stack &S1, Stack &S2, int x) {
  if (!StackOverflow(S1)) {
    Push(S1, x);
    return true;
  }

  if (StackOverflow(S1) && !StackEmpty(S2)) {
    cout << "队列满" << endl;
    return false;
  }

  // S1满且S2空,先将S1中的元素全部入S2,再入S1
  while (!StackEmpty(S1)) {
    int tmp;
    Pop(S1, tmp);
    Push(S2, tmp);
  }
  Push(S1, x);
  return true;
}

bool Dequeue(Stack &S1, Stack &S2, int &x) {
  if (!StackEmpty(S2)) {
    Pop(S2, x);
    return true;
  } 
  
  if (StackEmpty(S1)) {
    cout << "队列空" << endl;
    return false;
  }
  
  // S2为空且S1不为空
  while (!StackEmpty(S1)) {
    int tmp;
    Pop(S1, tmp);
    Push(S2, tmp);
  }
  Pop(S2, x);
  return true;
}

bool QueueEmpty(Stack S1, Stack S2) {
  return StackEmpty(S1) && StackEmpty(S2);
}
复制代码

4

image.png

  • たとえば、チェーンストレージ構造を選択する必要があります。これは、ヘッドとテールのポインタ(ヘッドフロント、テールリア)を含む単一の循環リンクリストです。
  • 空の状態front == rear
  • チーム全体の状態front == rear -> next
  • 「完全な判断、空の判断」の原則に従い、擬似コードを書くだけです

おすすめ

転載: juejin.im/post/7104657708556484616