アフィリエイト広告を利用しています

広告

posted by fanblog

2018年02月04日

《その274》 線形リストで実現する初歩的なスタック


 前回《273》の「線形リストで実現するスタック」については、とりあえず理解したつもりなんですが、自分の場合、なんとなく馴染めないままです。で、プログラムの省略できる部分を消して、線形リストのスタック動作を確認しやすくしてみました。
抽象クラステンプレートの話からそれてしまいます (- -;

 前回と同じ話の繰り返しで すみません m(_ _;)m

#include <iostream>
using namespace std;

#include <string>
#include <iostream>
using namespace std;

class ListStack {
// ノード ////////////////////////////////////////
class Node { //
public: //
string* data; // データ //
Node* next; // 次のノードを指すポインタ //
//
// ノードのコンストラクタ //
Node(string* str, Node* n) //
: data(str), next(n) { } //
}; //
//////////////////////////////////////////////////


Node* top; // 先頭(最新)ノードへのポインタ
Node* dummy; // ダミーノードへのポインタ

public:
// ListStack のコンストラクタ
ListStack() {

// 最初に生成する NULLデータを持つノードを指す
// ポインタ値を ポインタ top, dummy に代入。
// dummy の値は、これ以後 ずっと、不変です。

top = dummy = new Node(NULL, NULL);
}

// ▽--- ListStack のデストラクタ ---
~ListStack() {

// 先頭(最新)ノードへのポインタ top を ptr
// に代入。

Node* ptr = top;

// ptr と dummy が等しくなるまで(最後のノード
// に到達するまで)while文を繰り返します。

while (ptr != dummy) {
// 次のノードを指すポインタを temp に保管。
Node* temp = ptr->next;

// ptr の指すノードの記憶域を解放。
delete ptr;

// ptr に tempを代入して、ptr が次のノード
// を指すようにします。

ptr = temp;
}

// 最後に、dummy の指すノードの記憶域を解放。
delete dummy;
}
// △--- ここまで ListStack のデストラクタ ---

// メンバ関数 push

void push(const string& str) {
// 先頭ノードへのポインタ top を temp に保管。
Node* temp = top;

// 新しいノードを動的に生成し、この最新ノードへ
// のポインタ値を top に代入して、ポイン
// タ top が最新ノードを指すようにします。
// 最新ノードの data には、最新データを指す
// ポインタ値がセットされます。
// 最新ノードの next には、temp に入れてお
// いた旧先頭ノードを指すポイ
// ンタ値が、次データを指すポ
// インタ値として代入されます。

top = new Node(new string(str), temp);
}

// メンバ関数 pop
void pop() {
if (top == dummy) {
cout << " データが空です。\n";
}
else {
// 先頭ノードが持っている 次のノードへのポ
// インタ値を、tmp に保管します。

Node* tmp = top->next;

// 先頭ノードが持っているデータを tempに保
// 管します。

string temp = *(top->data);

// 先頭ノードが持っているデータの 記憶域を
// 解放。

delete top->data;

// 現在の先頭ノード用の記憶域を解放。
delete top;

// 先頭(最新)ノードへのポインタ top に、
// 次のノードへのポインタ値だった
// tmp を代入。
// これにより、次のノードだったも
// のが、先頭ノードに繰り上がりま
// す。

top = tmp;
cout << " " << temp << '\n';
}
}
}; // ------ ここまで class ListStack ------


int main() {
// スタック s を生成。
ListStack s;

while (1) {
int menu;
cout << "◆ 1.プッシュ 2.ポップ 0.終了:";
cin >> menu;

string x;
switch (menu) {
case 1: cout << " データ:";
cin >> x;
s.push(x);
break;

case 2:
s.pop();
break;

default: goto L;
}
}
L:;
}

f09_0074.png



この記事へのコメント
コメントを書く

お名前:

メールアドレス:


ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバックURL
https://fanblogs.jp/tb/7275039
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック

 たまに、クリック お願いします m(_ _)m

 AA にほんブログ村 IT技術ブログ C/C++へ

こうすけ:メール kousuke_cpp@outlook.jp

【1】★★C++ 記事目次★★ ← 利用可能です。
・新版明解C++入門編 / 新版明解C++中級編
・その他 C++ 関連記事

【2】★★こうすけ@C#★★
・C# の初歩的な記事


検索
<< 2018年08月 >>
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
プロフィール
こうすけさんの画像
こうすけ

 たまに、クリック お願いします m(_ _)m

 AA にほんブログ村 IT技術ブログ C/C++へ

こうすけ:メール kousuke_cpp@outlook.jp

【1】★★C++ 記事目次★★ ← 利用可能です。
・新版明解C++入門編 / 新版明解C++中級編
・その他 C++ 関連記事

【2】★★こうすけ@C#★★
・C# の初歩的な記事


×

この広告は30日以上新しい記事の更新がないブログに表示されております。