[伯俊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
整数を格納するスタックを実装し、入力としてのコマンドを処理するプログラムを作成します.
命令は全部で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ポインタとnextポインタはそれぞれnullptrとして指定されます.(ノードクラス作成者を参照)
すでにデータがある場合は、既存のヘッダポインタをprevNodeとして参照し、新しく作成したノードをハードノードとして指定し、prevNodeを新しく作成したノードの前のノードに設定し、prevNodeの次のノードを新しく作成したヘッダノードに設定します.
headポインタが指すノードを削除するノードとして指定し、hardノードを再指定します.
文字列入力を%sで受け入れた後、strcmp関数でコマンドと比較し、必要な整数%dを得る.簡単です.
#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;
}
Reference
この問題について([伯俊C+]10828スタック), 我々は、より多くの情報をここで見つけました https://velog.io/@cldhfleks2/10828テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol