51Nod 2160 數字遊戲 刷題筆記

1. 題目描述

1.1. Limit

Time Limit: 1000 ms

Memory Limit: 131072 kB

1.2. Problem Description

現在有nn個數字依次進入一個棧,每個數字aa進入棧的時候,如果棧頂元素小於aa,則會將棧頂元素彈出,新的棧頂元素如果仍然小於aa,則會將新的棧頂元素繼續彈出,直到棧頂元素大於等於aa爲止,aa纔會加入棧。問nn個數字依次進入後,最後棧裏的數字依次是?


1.3. Input

輸入第一行一個整數n(n100000)n(n \le 100000),表示有nn個數字依次進入棧。
接下來nn行,每行一個整數,表示第ii個數字。


1.4. Output

若干行,表示最後棧中的數字。


1.5. Sample Input

5
5
3
2 
4
1

1.6. Sample Output

5
4
1

1.7. Source

51Nod 2160 數字遊戲


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,有問題歡迎通過郵箱交流。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章