スタック

15905 ワード

*この記事は2022年1月から2月までのNOTIONについて検討したものです.

-22.1.13スタッククリーンアップ


スタックとは?



スタックの実装

  • スタック関連関数1)is empty():空の
    //배열
    **bool is_empty_stack(){**
    	/*if (top == -1)return true;
    	else return false;*/
    	return(top == -1);
    }
    //연결리스트
    bool is_empty_stack() {
    	return(SP == NULL);
    }
    2であるか否かを判定するis full():スタックが
    //배열
    **bool is_full() {**
    	/*if (top == MAX_SIZE - 1)return true;
    	else return false;*/
    	return(top == MAX_SIZE - 1);
    }
    //연결리스트는 자료의 공간이 모자랄 일이 없음. 따라서 full 판단 함수도 존재하지 않음
    3で満たされているか否かを判定する:スタックの総データ出力
    //배열
    **void push(element data) {**
    	if (is_full()) { cout << "error:stack full" << endl; }
    	else { **Stack[++top] = data;** }
    }
    //연결리스트
    void push(element data) {
    	Node* new_node = new Node;
    	new_node->item = data;
    	new_node->link = NULL;
    	if (SP == NULL) {
    		SP = new_node;
    	}
    	else {
    		new_node->link = SP;
    		SP = new_node;
    	}
    }

  • アレイを使用したスタックの実装
    👉 アレイのみを使用したスタック実装
    //배열
    **element pop() {**
    	if (is_empty_stack()) { cout << "error:stack empty" << endl; return -1; }
    	else return **Stack[top--]**;
    }
    👉 配列とオブジェクトを使用したスタックの実装
    //연결리스트
    element pop() {
    	if (is_empty_stack()) { return-1; }
    	else {
    		element item = SP->item;
    		SP = SP->link;
    		return item;
    	}
    }
  • 接続リストを使用してスタック
    //배열
    **element peek() {**
    	if (is_empty_stack()) { cout << "error:stack full" << endl; return -1;}
    	else { return Stack[top]; }
    }
  • を実装する.

    22.01.14百人編集(接続リスト)解答

  • 改訂前
    //연결리스트
    element peek() {
    	if (is_empty_stack()) { return -1; }
    	else {
    		return SP->item;
    	}
    }
  • 訂正後(エラーチェック後正解)
    //배열
    **void print_stack() {**
    	cout << "[stack status: top: "<<top<<"]" << endl;
    	if (is_empty_stack()) { cout << "error:empty stack" << endl; }
    	else {
    		for (int i = 0; i <= top; i++) {
    			cout << Stack[i] << endl;
    		}
    	}
    }
  • 関連STLまとめ
    //연결리스트
    void print_stack() {
    	cout << "stack status" << endl;
    	if (is_empty_stack()) { cout << "error: empty stack" << endl; }
    	else {
    		for (Node* list = SP; list != NULL; list = list->link) {
    			cout << list->item << endl;
    		}
    	}
    }
  • 後期
  • list STLについて説明します.初めて使うのはSTLを整理するいい機会です
  • エラーが多すぎます.ほとんどはメンバー関数の機能を理解していないために書かれたエラーです.
  • 印象的なエラーをいくつかまとめました
  • erase(反復器)の戻り値は反復器!!!関数で削除操作を行った後、削除ノードの右側のノードに戻ります.つまり、この関数を無視するとエラーが発生します.このリピーターを受信するには、リピーターが必要です.(ただし、重複文字の生成はよく理解できないので、もう一度見てみます)
  • 挿入(重複者、挿入するデータ)は、現在の重複者が指すノードの左側に作成されます.左です.右ではありません.
  • 覚えていますが、実はSTLなしで直接接続リストを作成して実現したいのですが、このようにすると初期値の生成から難しいです.だからSTLは使えなかったんだけど今回の勉强が终わってSTLが一つも叶わなかったので残しておきました