文章目錄
1. 題目描述
1.1. Limit
Time Limit: 1000 ms
Memory Limit: 131072 kB
1.2. Problem Description
現在有個數字依次進入一個棧,每個數字進入棧的時候,如果棧頂元素小於,則會將棧頂元素彈出,新的棧頂元素如果仍然小於,則會將新的棧頂元素繼續彈出,直到棧頂元素大於等於爲止,纔會加入棧。問個數字依次進入後,最後棧裏的數字依次是?
1.3. Input
輸入第一行一個整數,表示有個數字依次進入棧。
接下來行,每行一個整數,表示第個數字。
1.4. Output
若干行,表示最後棧中的數字。
1.5. Sample Input
5
5
3
2
4
1
1.6. Sample Output
5
4
1
1.7. Source
2. 解讀
使用STL中的 Vector
按照題目中的要求模擬棧的入棧出棧即可。
注:在判斷棧頂元素是否小於即將入棧的元素的for
循環中,不能使用 i < stack.size()
來判斷是否跳出循環,因爲出棧時 stack.size()
會減1
,這樣使用會導致循環最多隻能遍歷一半棧中的元素。
3. 代碼
#include <iostream>
#include <string.h>
#include <vector>
using namespace std;
int main()
{
long long n;
// 讀入n
scanf("%lld", &n);
// 初始化棧
vector<int> stack;
// 棧的深度
long long stackDepth = 0l;
// buffer
long long buffer;
// 若大於0
if (n > 0) {
// 讀取第一個元素
scanf("%lld", &buffer);
// 入棧
stack.push_back(buffer);
// 深度加1
stackDepth++;
// 讀入入棧元素
for (long long i = 1; i < n; i++) {
// 讀取輸入
scanf("%lld", &buffer);
size_t sizeBuffer = stackDepth;
for (size_t j = 0; j < sizeBuffer; j++) {
// 若棧頂元素小於即將新入棧的元素buffer
if (stack[stackDepth - 1] < buffer && stackDepth > 0) {
// 棧頂元素出棧
stack.pop_back();
// 深度減1
stackDepth--;
} else {
break;
}
}
// 元素入棧
stack.push_back(buffer);
// 深度加1
stackDepth++;
}
// 輸出棧內元素
for (size_t i = 0; i < stack.size(); i++) {
printf("%d\n", stack[i]);
}
}
}
聯繫郵箱:[email protected]
Github:https://github.com/CurrenWong
歡迎轉載/Star/Fork,有問題歡迎通過郵箱交流。