データ構造-第3章-スタックとキュー(3)-チェーンスタックの表現と実装

データ構造


⚡️データ構造-第1章
⚡️抽象データ型の場合
⚡️データ構造-第2章(1)-線形構造
⚡️データ構造-第2章(2)-線形テーブルの順次表現と実装
⚡️データ構造-第2章(3)-シーケンステーブル(コード付き)
⚡️データ構造-第2章(4)-シーケンステーブルケース(コード付き)
⚡️データ構造-第2章(5)-連鎖ストレージ構造
⚡️データ構造-第2章(6)-基本操作の実装単一リンクリストの
⚡️データ構造-第2章(7)-二重リンクリストと循環リンクリスト
⚡️データ構造-第2章(8)-線形リストの適用(線形リストのマージ)

チェーンスタックの表現と実装

  チェーンスタックとは、チェーン構造で実装されたスタックのことです。通常、チェーンスタックは単一リンクリストで表されます。

  リンクスタックのポインタ方向は、単一リンクリストのポインタ方向と反対であることに注意してください。

  チェーンスタックのノード構造は、単一リンクリストのノード構造と同じです。ここでは、SタックノードStackNodeです。S t c k N o d eは、次のように定義されます

typedef struct StackNode
{
    
    //构造一个空栈,栈顶指针置空
	ElemType data;
	struct StackNode* next;
}StackNode, *LinkStack;

  スタックの主な操作はスタックの一番上に挿入および削除することであるため、リンクリストの先頭をスタックの一番上として使用するのが明らかに最も便利であり、先頭ノードを追加する必要はありません。単一リンクリストのような操作の便宜のために。
ここに画像の説明を挿入

チェーンスタックの初期化

Status InitStack(LinkStack &S)
{
    
    
	S=NULL;
	return OK;
}

ここに画像の説明を挿入

チェーンスタックが空かどうかを確認します

ここに画像の説明を挿入

スタックスタック

  シーケンシャルスタックのプッシュ操作との違いは、チェーンスタックは、スタックをプッシュする前にスタックがいっぱいかどうかを判断する必要がなく、プッシュ要素にノードスペースを動的に割り当てるだけでよいことです。

【アルゴリズムステップ】

  • ①プッシュ要素eにスペースを割り当て、ポインタpを使用してそれをポイントします。
  • ②新しいノードデータフィールドをeに設定します。
  • ③新しいノードをスタックの一番上に挿入します。
  • ④スタックのトップポインタをpに変更します。
    ここに画像の説明を挿入
Status Push(LinkStack &s, SElemType e)
{
    
    //在栈顶插入元素e
	p = new StackNode; 	//生成新节点
	// p = (StackNode*)malloc(sizeof(StackNode));
	p->data = s;		//将新节点数据域置为e
	p->next = s;//将新节点插入栈顶
	s=p;			//修改栈顶指针为p
	return OK;
}

スタックスタック

  シーケンシャルスタックと同様に、チェーンスタックも、スタックをポップする前にスタックが空かどうかを判断する必要があります。違いは、チェーンスタックがポップされた後、スタック要素の上部スペースを解放する必要があることです。

【アルゴリズムステップ】

  • ①スタックが空かどうかを判断し、空の場合はERRORERRORを返しますE R ROR _ _

  • ②スタックの最上位要素をeに割り当てます。

  • ③スタックの一番上の要素スペースを一時的に保存して解放します。

  • ④新しいスタックトップ要素を指すようにスタックトップポインタを変更します。

  • ⑤元のスタックの一番上の要素のスペースを解放します。

ここに画像の説明を挿入

Status Pop(LinkStack &s, SElemType &e)
{
    
    //删除s的栈顶元素,用e返回其值
	if(NULL == s)
		return ERROR;	//栈空
	e = s->data; 		//将栈顶元素赋给e
	p = s;			//用p临时保存栈顶元素空间,以备释放
	s = s->next;		//修改栈顶指针
	delete p;		//释放原栈顶元素的空间
	return OK;
}

スタックの最上位要素を取得します

  シーケンシャルスタックと同様に、スタックが空でない場合、この操作はスタックの現在の最上位要素の値を返し、最上位スタックポインタは変更されません。

ここに画像の説明を挿入

SElemType GetTop(LinkStack s)
{
    
    //返回s的詹元素,不修改指针
	if(s)	//栈非空
		return s->data;//返回栈顶元素的值,栈顶指针不变
}

要約する

私とのコミュニケーションを楽しみにしています。メッセージやプライベートメッセージを残し、一緒に学び、一緒に進歩してください!

おすすめ

転載: blog.csdn.net/CltCj/article/details/122631485