[規格C+]10866インデックス


質問する
整数を格納するスタックを実装し、入力としてのコマンドを処理するプログラムを作成します.
命令は全部で5種類ある.
push X:整数Xをスタックに入れる演算.
pop:スタックの一番上の整数を除去し、出力します.スタックに整数がない場合は、-1が出力されます.
size:スタック内の整数の個数を出力します.
空:スタックが空の場合、1または0が出力されます.
top:スタックの一番上の整数を出力します.スタックに整数がない場合は、-1が出力されます.
入力
1行目に与えられるコマンド数N(1≦N≦10000).2行目からN行目までそれぞれ1つのコマンドがあります.与えられた整数は1以上であり、100000以下である.問題にない命令はない.
しゅつりょく
出力するコマンドが発行されるたびに、各行に1つのコマンドが出力されます.
https://www.acmicpc.net/problem/10828
に答える
ポインタを使用してノード単位でインデックスを作成します.
まずノードクラスです.

prevでは、次のポインタが隣接ノードに接続されます.
次はdexクラス本体です.

JENERICタイプを使用してノードとインデックスクラスを実装し、ジェネレータはJENERICを使用しません.
  • push_front/push_back

    最初にインデックスにデータを格納すると、1回の処理は1つの末尾ノードと1つのヘッダノードと同じです.
    データがインデックス内にある場合、ヘッダポインタは前の最上位ノードを指し、そのノードの次のノードを新しく作成したノードとして指定します.
    困難なノードをノードにリセットするプロセス.
  • pop_front/pop_back

    各ヘッドノードとテールノードを削除するノードとして指定します.
    各前のノード、次のノードをヘッドノード、テールノードにリセットします.
  • empty/size/front/back

  • 最後の入力部

    %sで受信した文字列とstrcmpで受信した文字列を比較した.
  • #define _CRT_SECURE_NO_WARNINGS 
    #include <bits/stdc++.h>
    //제네릭타입으로 구현
    template <typename T>
    class Node {
    public:
    	T data = NULL;
    	Node<T>* prev = nullptr, * next = nullptr;
    	//생성자에는 제네릭X
    	Node(T data,
    		Node<T>* prev = nullptr,
    		Node<T>* next = nullptr)
    		: data(data), prev(prev), next(next) {}
    };
    
    template <typename T>
    class Deque {
    private:
    	int dataSize = 0;
    	Node<T>* tail = nullptr, * head = nullptr;
    public:
    	//생성자에는 제네릭X
    	Deque() {}
    	~Deque() {}
    	void push_front(const T data);
    	void push_back(const T data);
    	T pop_front();
    	T pop_back();
    	T front() const;
    	T back() const;
    	bool empty() const;
    	int size() const;
    };
    
    template <class T>
    void Deque<T>::push_front(const T data) {
    	if (empty()) {
    		head = new Node<T>(data);
    		tail = head;
    	}
    	else {
    		Node<T>* newNode = new Node<T>(data, head, nullptr);
    		head->next = newNode;
    		head = newNode;
    	}
    	dataSize++;
    }
    
    template <class T>
    void Deque<T>::push_back(const T data) {
    	if (empty()) {
    		head = new Node<T>(data);
    		tail = head;
    	}
    	else {
    		Node<T>* newNode = new Node<T>(data, nullptr, tail);
    		tail->prev = newNode;
    		tail = newNode;
    	}
    	dataSize++;
    }
    
    template <class T>
    T Deque<T>::pop_front() {
    	if (empty())
    		return -1;
    	T data = front();
    
    	Node<T>* delNode = head;
    	head = head->prev;
    	delete delNode;
    	dataSize--;
    
    	if (dataSize == 0)
    		head = nullptr;
    	return data;
    }
    
    template <class T>
    T Deque<T>::pop_back() {
    	if (empty())
    		return -1;
    	T data = back();
    
    	Node<T>* delNode = tail;
    	tail = tail->next;
    	delete delNode;
    	dataSize--;
    
    	if (dataSize == 0)
    		tail = nullptr;
    	return data;
    }
    
    template <class T>
    bool Deque<T>::empty() const {
    	return dataSize == 0;
    }
    
    template <class T>
    int Deque<T>::size() const {
    	return dataSize;
    }
    template <class T>
    T Deque<T>::front() const {
    	if (empty())
    		return -1;
    	return head->data;
    }
    
    template <class T>
    T Deque<T>::back() const {
    	if (empty())
    		return -1;
    	return tail->data;
    }
    
    int main(int n, int num) {
    	scanf("%d", &n);
    	Deque<int> d;
    	for (int i = 0; i < n; i++) {
    		char c[12]; //정수앞 공백까지 11자 + \0 = 12
    		scanf("%s", c);
    		if (!strcmp(c, "push_front")) {
    			scanf("%d", &num);
    			d.push_front(num);
    		}
    		else if (!strcmp(c, "push_back")) {
    			scanf("%d", &num);
    			d.push_back(num);
    		}
    		else if (!strcmp(c, "pop_front")) {
    			printf("%d\n", d.pop_front());
    		}
    		else if (!strcmp(c, "pop_back")) {
    			printf("%d\n", d.pop_back());
    		}
    		else if (!strcmp(c, "size")) {
    			printf("%d\n", d.size());
    		}
    		else if (!strcmp(c, "empty")) {
    			printf("%d\n", d.empty() ? 1 : 0);
    		}
    		else if (!strcmp(c, "front")) {
    			printf("%d\n", d.front());
    		}
    		else if (!strcmp(c, "back")) {
    			printf("%d\n", d.back());
    		}
    	}
    	return 0;
    }