迷惑なチャタリングデータ構造(II)

会話データ構造スタック

隋Suinian

ではデータ構造迷惑なチャタリング(a)は、スタックへの参照、それはコンピュータの分野で非常に重要な概念であると言うことができ、我々は、(例えば、高レベル言語のように、その使用を見つけることができますstack<int>)、我々はまた、アセンブリ言語で見つけることができます(ニーモニックpush、スタックに関連する概念)、それも、ハードウェアで(特定例えば、x86の浮動小数点レジスタ構造)スタック分かります。

私たちは、スタックの話をしている、それは通常、次の2つの条件を参照します。

  1. スタック(プログラミングに使用されるstack<int>)およびその関連する操作。

  2. (ないスタック・ポインタstack<int>top質問変数が、メモリ割り当てられたスタックオーバーフローこの種のプログラムは実行されます)

問題があります:私たちは通常、参照スタック実際に、ヒープスタックの二つの要素。ヒープを理解するために、話のほとんどがあるヒープソート、基本となる言語をよりよく理解するために、についてお話します特定の変数はヒープに割り当てられており、特定の変数がスタックに割り当てられ、その後、少し深いメモリをお話しますヒープとスタック領域の(成長方向、キャッシング、ライフサイクルのような話が)、より深い...... emmm ......申し訳ありませんが、私の限られたレベル、もう話をしません。

スタック

データ構造の定義におけるスタックは非常に簡単です:1はスタックの唯一の線形動作テーブルトップことができます

この定義は明確にスタックがリニアテーブルでなければならない定義、および暗黙的にスタックの先頭の数を制限します。

一部の人々は、これは、スタックの一番上にあるべきと主張権利だけではありませんか?どのように我々は、スタックの最上位の数を議論するのでしょうか?

スタックは、絶対概念(トップがトップで、トップの上にある)である場合には、スタックの最上位は本当に一つだけを言うことができます。

しかし、スタックの最上部に対する定義は、スタックの底部及びその逆、そしてちょうどスタックの底部の下、上記スタックにおいて、実際にされています。

私は尋ねたように、2本の平行線がそれを交差しますか?ほとんどの人は、無意識のうちにお答えします2本の平行線が交差したことがない、間違っていますか?はい。しかし、この質問に答える前に、私たちは、この問題はユークリッド幾何学システムで議論さで黙認しています。他の非ユークリッド幾何学では、この質問に対する答えは、ケースではありません。

スタックの先頭の数

  1. スタックのトップは、それは、数0することができますか?

(積み重ねない)スタックを指定しない場合は答えは何をされ、その後、スタックが存在しなかったことを意味し、何の入り口操作はありません。

それとも誰かが、これは通常の線形形式にスタックから縮退されていない、と言うかもしれませんか?スタック自体は、リニアテーブルですが、課しので、これは私が、明確な答えを与えることができない制約を、スタックが唯一その特殊性を持っています。この制約がなければ、それはスタックと呼ばれることができません。

  1. スタックのトップは数1、標準スタックであります

スタックのこのタイプは、我々は最初のスタックのボトムアップ成長を考えます:

スタックのボトムアップ成長

次のようにその実装は次のようになります。

const int MAXSIZE = 10;
// 1. 声明一个栈
int stack[MAXSIZE];
int top = -1;

// 2. 栈空
top == -1;

// 3. 栈满
top == MAXSIZE;

// 4. 压栈push(x)
stack[top++] = x;

// 5. 弹栈pop()
int x = stack[top--];

// 6. 读取栈顶元素
int x = stack[top];
复制代码

この実装では、基本的には、このメソッドを使用して単純な固定サイズのスタックを達成することができ、限り言語は配列をサポートとして、普遍であると言うことができます。

この実装では、インデックス位置-1、スタックの成長方向に設けられたスタックの一番下にデフォルト設定されます-1-> 10、ひいては、スタックの一番下の位置にあるため、また、提供可能であり、スタックは相対的です。

:ほとんどの言語では、-1、違法な指標である、スタックを使用するには、[-1]違反エラーにアクセスすると、このエラーは致命的なエラー(胎児エラー)で、プログラムは終了します。しかし、いくつかの言語は、-1合法的な指標である、インデックスがある背面から前方を表していますstack[-1] = stack[MAXSIZE-1];ここで1インデックスは、メモリ内の一方で、単に配列の最初の要素の前に、-1の位置値へのアクセスをアクセスしようとしていないが、それは、不正な操作の規定の言語だけではないと言う-1に対応する位置場所にアクセスし、初期化されないかもしれません(実際に成功した訪問は、通常はint型の値の符号がある場合)、無効な値を得ることができ、この位置は、他の変数、またはプログラムに配布されている可能性がありその訪問は成功し、この時間は、他のプログラム、さらにはオペレーティングシステムがクラッシュし、取り返しのつかない損失を行います。配列で、我々は違法なコンテンツのインデックス作成にアクセスすることができない、あるいは単にアクセスが与えられますので、もちろん、コンパイラと仮想機会は、この問題を検討します。リストが実装されている場合はチェーンのスタックを、私たちは、ポインタを使用するように注意する必要があります。

  1. スタック2のスタックの数は、存在しますか?

中央に向かって両側で同じ時間の増加であり、当然である2つのスタックは、スタックを共有している、それぞれMAXSIZE位置に対応し、-1。

1と配列のインデックス10

共有スタック

top1 = -1;
top2 = MAXSIZE;

// top1压栈做自增操作,弹栈做自减操作
// top2压栈做自减操作,弹栈做自增操作
// 栈满是top1+1 == top2;
复制代码

メモリでは、スタックとヒープは、ビット共有スタックのように、空き領域を共有している、私たちは「スタック」または理由を参照してください。

  1. スタックのトップは、数2以上である、存在しますか?

これまでのところ、我々は内容がスタックの穴開いた脳のトップが2以上である見つけることができませんでしたどのようにして、1次元である議論してきました。

そう、展開するスタックを共有することを強制すれば、私たちは本当に数が2以上であるスタックのトップが、この時間を見つけることができ、我々はこの記事で論理的な欠陥を見つけるshould'llそして、このセクションでの議論のため、この抜け穴は致命的です。

瓦解

この記事は、標準的な分裂を議論する際にスタックのスタックの先頭の数に基づいていますが、ここを参照してください、私たちは、スタックの最上位の数が2以上のとき、つまり、論理的な欠陥を見つけることができるはず、彼はではなく、スタック以上にありますスタックアップ。

したがって、数分割でのスタック型としてスタックの最上部ではなく、この資料に記載されている何ですか?複合スタックそれ?えっようなビット。しかし、私たちのために、それだけでそのような使用の複合体を以下のように思えます。

template <class T>
class MinStack<T> {
private:
  stack<T> st;
  stack<T> min;
}

// 最小栈的算法,还是挺经典的,可以自己查一查。
复制代码

最小スタック

概要

この記事の内容は、1スタックに、総括するだけでなく、二つの基本的な概念について話しています。

物理的な構造によって、スタックは2つの広いカテゴリーに分かれています。

  1. スタック順序

順次格納順序と呼ばスタックスタックは:メモリ内のアプリケーションの集合である隣接スタックの要素を記憶する記憶部、すなわち、アレイを実現することができるされています。

  1. チェーンスタック

スタックメモリスタックと呼ばれる鎖用い鎖:スタックメモリ素子の不連続を各メモリセルのアドレスが格納位置に小さな要素を予約している間は、それは単一のリンクリストの実装を考えることができるです。

スタックスタックのと鎖配列

実現を置くためにスタックを実装することは困難ではない、記事が少し長いですので、私はコードを保持、と思いました。

卵|ू・ω・):何この記事から取得することは、私は数えることができると言うことではない、ただ誰が記事を送信するためにあえてしない、誰もがこの記事で送ることができることを願って、彼は非常に綿密な記事であると言います年齢は、独立して考えることを学ぶために、非常に綿密な記事誤解を招くような、一見非常に合理的ではありません。彼らの言うことのために、担当者が記事を書いていない、それは迷惑です。

おすすめ

転載: juejin.im/post/5d87539bf265da03d2117d3d