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:;
}
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/7275039
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック