[白俊/C+]10773号:0


質問する


ロコド機長の
ヒョンミンがお金を管理するのを手伝う過程で、残念なことにいつも忙しくて、ヒョンはお金を誤って呼ぶ事故をよく犯します.
宰賢は間違った数字を叫ぶたびに0を叫んで、最近の
このようにすべての数字を書いた後の数字の和を知りたい.渽民を助けましょう!
質問の表示

入力


最初の行は整数Kを与える.(1 ≤ K ≤ 100,000)
その後、K行に整数を与えます.整数には0~1000000の値があり、整数が0の場合は最後に書き込まれた数値が消去され、そうでない場合は対応する数値が書き込まれます.
整数が0の場合に消去できることを保証します.

しゅつりょく


民が最終的に書いた数字とを出力します.最終的に得られた数の和は231−1以下の整数である.



ヒント


シミュレーション例2.
[1][1,3]
[1,3,5][1,3,5,4]
[1,3,5](0と呼ばれているので最近の数を除く)
[1,3](すでに0と呼ばれているので、次の最近の数を削除)
[1,3,7][1,3](0と呼ばれているので最近の数を除く)
[1](0が呼び出されたため、次の最近の数値を削除)
[1,6]
と七です.

アイデア


これは「最近書いた数をクリアする」という問題のため、後進先出(LIFO)構造スタックを使用します.
もし、渽民が数字を間違えて歌った場合、宰鉉が0を叫ぶと、popは最近、渽民に書いた数字を削除させ、渽民が数字を正しく歌えば、相応の値を押すことになる.
K入力が完了すると、スタック内の数字を新しい変数に1つずつ結合してポップアップします.

コード#コード#

#include <iostream>
#include <stack>
using namespace std;
int main() {

	int K;
	cin >> K;
	int num;
	stack<int> stk;
	for(int i = 0; i < K; i++) {
		cin >> num;
		if (num == 0) {
			stk.pop();
		}
		else {
			stk.push(num);
		}
	}
	int sum = 0;
	for (int i = stk.size(); i > 0; i--) {
		sum = sum + stk.top();
		stk.pop();
	}
	cout << sum << endl;

	return 0;
}

試行錯誤

// 왜 i<=stk.size()만큼 반복하는지 모르겠음
for (int i = 0; i < stk.size(); i++) {
	sum = sum + stk.top();
	stk.pop();
}
最初にfor文の条件を次のように設定します.
i <= stk.size()
何度も繰り返す.この部分は理解できないので、while文を先に使います.
// while문 사용
while (stk.empty() == 0) {
	sum = sum + stk.top();
	stk.pop();
}
この場合、コードは正常に動作します.これに基づいて、forクエリ条件をstk.size()から小さくする方法に変更します.コードが1行1行繰り返されるにつれて、最初の条件文が必要になることに気づきました.