[伯俊C+]10828スタック


質問する
整数を格納するスタックを実装し、入力としてのコマンドを処理するプログラムを作成します.
命令は全部で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
に答える
ノードとポインタを使用してスタックを実装してみます.
  • ノードクラス

  • スタッククラスホスト

  • push

    スタックに初めてデータを入れるとprevポインタとnextポインタはそれぞれnullptrとして指定されます.(ノードクラス作成者を参照)
    すでにデータがある場合は、既存のヘッダポインタをprevNodeとして参照し、新しく作成したノードをハードノードとして指定し、prevNodeを新しく作成したノードの前のノードに設定し、prevNodeの次のノードを新しく作成したヘッダノードに設定します.
  • pop

    headポインタが指すノードを削除するノードとして指定し、hardノードを再指定します.
  • size/empty/top

  • 入力部

    文字列入力を%sで受け入れた後、strcmp関数でコマンドと比較し、必要な整数%dを得る.簡単です.
  • https://www.acmicpc.net/problem/10828
    #define _CRT_SECURE_NO_WARNINGS 
    #include <bits/stdc++.h>
    
    template <typename T>
    class Node {
    public:
    	T data= NULL;
    	Node<T> *next = nullptr, *prev = nullptr;
    	Node(T data
    		, Node<T> *prev = nullptr
    		, Node<T>* next = nullptr)
    		: data(data), prev(prev), next(next) {}
    };
    
    template <typename T>
    class Stack {
    private:
    	Node<T> *head = nullptr;
    	int dataSize = 0;
    public:
    	Stack() {}
    	~Stack() {}
    	void push(const T data);
    	T pop();
    	int size() const;
    	bool empty() const;
    	T top() const;
    };
    
    template <typename T>
    void Stack<T>::push(const T data) {
    	if (empty()) {
    		head = new Node<T>(data); //새로만든노드를 헤드로 지정
    	}
    	else {
    		Node<T> *prevNode = head;
    		head = new Node<T>(data, prevNode, nullptr);//새로만든노드를 헤드로 재지정
    		prevNode->next = head; //이전노드와 새로만든노드 연결
    	}
    	dataSize++;
    }
    
    template <typename T>
    T Stack<T>::pop() {
    	if (empty()) {
    		return -1;
    	}
    	T data = top();
    	Node<T> *delNode = head;
    	head = head->prev;
    	delete delNode;
    	dataSize--;
    	return data;
    }
    
    template <typename T>
    int Stack<T>::size() const {
    	return dataSize;
    }
    
    template <typename T>
    bool Stack<T>::empty() const{
    	return dataSize == 0;
    }
    
    template <typename T>
    T Stack<T>::top() const {
    	if (empty())
    		return -1;
    	return head->data;
    }
    
    int main(int n) {
    	scanf("%d", &n);
    	Stack<int> s;
    	while (n--) {
    		char c[6];
    		int num;
    		scanf("%s", c);
    		if (!strcmp(c, "push")) {
    			scanf("%d", &num);
    			s.push(num);
    		}
    		else if (!strcmp(c, "pop")) {
    			printf("%d\n", s.pop());
    		}
    		else if (!strcmp(c, "size")) {
    			printf("%d\n", s.size());
    		}
    		else if (!strcmp(c, "empty")) {
    			printf("%d\n", s.empty() ? 1 : 0);
    		}
    		else if (!strcmp(c, "top")) {
    			printf("%d\n", s.top());
    		}
    	}
    
    	return 0;
    }