スタック
6112 ワード
抽象データ(ADT)
クラスによる実装
ADTコンテンツ
=>classでそれぞれ定義されている場合(実装されている場合)、メンバー変数、メンバー関数、エラーヘンドラーは
※注意!ADTは機能のみを記述し、実施方法は記述しない!性能分析X
パフォーマンス分析に使用されるのは疑似コードです
スタックADT
last-in-first-out(LIFO)
データ構造のナビゲート、挿入、削除に必要な3つの基本機能:
=>削除(pop)操作に集中したスタックのデータ構造
同じタイプのデータしか保存できません.ただし、ストレージタイプは関連x
メソッドの説明
データ構造は自由に実装できますが、その特性に応じて適切に実装する必要があります.
Push(オブジェクト):戻り値x.同じタイプのデータしか格納できません
object pop():プログラマーの好み(必要)に応じて、戻り(object)を指定せずに削除するか、削除と同時に戻ることができます.
objecttop():上部に誰がいるかを答えるだけでいい
integer size():整数要素を返します.
ブール空():空かどうかを判断し、ブール型に戻ります.
スタックADTインタフェース
各メソッドは、必要に応じて、返すかどうか、返すかどうかタイプなど、特定の実施内容を変更することができる.
スタックが空の場合、空()またはpop()が呼び出されます.
例外ハンドラthrow(StackEmpty)を有効にします.
// 메소드의 선언만 적어놓음 (각 메소드 정의 내용은 안 적어놓았음)
template <typename E>
class Stack{
public:
int size() const;
bbol empty() const;
const E& top() const;
throw(StackEmpty);
void push(const E& e);
void pop() throw(StackEmpty);
}
例外ハンドラ
特定のコード・ケースの問題の解決に役立ちます
形状:throw Handler名
=>
スタックでハンドルを使用する場合.
スタックの使用範囲
「Webブラウザで戻る」ボタン(最近アクセスしたサイトに戻る必要がある場合があります)
テキストエディタ=>UNDO機能を実装するには、コマンドを保存する必要があります.
ケース
Run-Time Stack
(ex.PC=3=>ストレージは3行目に戻る必要があります)
サンプル分析
スタック実装
アレイ別スタックの実装
配列でスタックを実装する:アルゴリズムを作成し、関数を設計して、配列を使用してデータを格納し、配列を使用して演算する(push、top、pop)
格納するデータ・オブジェクトに加えて、スタックには上部位置(インデックス)を格納する整数変数が必要です.
(配列はインデックスに基づいて要素の場所にアクセスします.)
リンクリスト位置を実際のアドレスとして保存(ポインタを使用)
// t : 스택의 꼭대기 인덱스를 저장하는 정수형 변수
// int t = -1; 으로 초기값이 설정되었을 것임
// S : 배열
Algorithm size()
return t+1
Algorithm empty()
{
if S.size() = 0 then
return true
else
return false
}
Algorithm pop()
if empty() then
throw StackEmpty
else
t <- t -1 // 꼭대기 인덱스만 하나 이동시키면 마치 삭제된듯한 효과 발생(실제로 메모리에서 삭제되진 않음)
return S[t+1] // t를 1감소시켰으므로 꼭대기 원소를 삭제하려면 t+1 에 있는 것을 삭제
Algorithm top()
if empty() then
throw StackEmpty
else
return S[t]
Algorithm push(o)
if t = S.size() -1 then // 배열이 꽉찼는데 push 하는 경우
throw StackFull
else
t <- t + 1
S[t] <- 0
スタック性能分析
=>半分は正しい、半分は間違っている.正しい言い方ではない.
ただし、スタックを配列またはリンクリストとして実装すると、パフォーマンス分析が可能になります.
すなわち、ADTは「性能分析」を行うために「実施」しなければならない.
アレイ内のスタックパフォーマンスの解析
5つの機能(push,pop,top,空,size)はいずれもO(1)
空間はO(N)と同じように=>nではなくN!!(n:配列(スタック)の要素数、N:配列のサイズを指定)
(メモリを初めて割り当てる場合、演算量は配列のNとなります.)
限界:最大寸法は予め定められており、変更されません.→stackFullエラー
Algorithm size()
return t+1
Algorithm pop()
if empty() then
throw StackEmpty
else
t <- t -1
return S[t+1]
Algorithm top()
if empty() then
throw StackEmpty
else
return S[t]
Algorithm push(o)
if t = S.size() -1 then // 배열이 꽉찼는데 push 하는 경우
throw StackFull
else
t <- t + 1
S[t] <- o
リンクリストとして実装
リンクリストのheadをtopに設定
データ構造に輸出入がある
任意の位置の情報を提供するだけで、高速演算が可能
すべての演算はO(1)で実行される
push、pop、top演算子コード(大まかに記述)
// p : 노드 포인터 (node* p = new node;)
Algorithm push(data)
p <- new node pointer struct(?) 이렇게 적는게 맞나
p.data <- data
top.next <- p
top <- p
size <- size + 1
Algorithm pop()
if empty() then
throw StackEmpty
else
q <- top
top <- top.next
size <- size - 1
return p <- data
Algorithm top()
if empty() then
throw StackEmpty
else
return top.data
Algorithm empty()
if top = NULL then
return true
else
return false
なぜ単一リンクリストでheadをtopとして使用するのか
popによるsinglelist tailの演算にはO(n)が必要である
A.最後の要素を削除したpopを比較します.
いいけど
完了するプロセス.
O(n)次検索tailの前のノードを実行します.
tailをトップに置くのはheadをトップに置くより効率が低い.
Reference
この問題について(スタック), 我々は、より多くの情報をここで見つけました https://velog.io/@msung99/스택テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol