首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

棧出棧順序合法性判斷:賦值誤寫為比較導致全 No 修復

     編輯:程式設計綜合問答

原代碼關鍵錯誤


if (r = 1) break;   // ① 應為 ==
if (r = 0) cout << "Yes"; // ② 應為 ==

r = 1 是賦值,值為 1 (true) → 條件恒成立 → break → 後續邏輯不執行。r = 0 值為 0 (false) → 恒輸出 No。

修正版核心邏輯


bool isValidPopOrder(const vector& pop) {
    stack st;
    int pushIdx = 1; // 1~10 入棧
    for (int val : pop) {
        while (st.empty() || st.top() != val) {
            if (pushIdx > 10) return false; // 入棧耗盡仍不匹配
            st.push(pushIdx++);
        }
        st.pop(); // 匹配,出棧
    }
    return true;
}

int main() {
    int T; cin >> T;
    while (T--) {
        vector pop(10);
        for (int i = 0; i < 10; ++i) cin >> pop[i];
        cout << (isValidPopOrder(pop) ? "Yes" : "No") << '\n';
    }
}

算法解析

  • 模擬入棧 1~10,嘗試匹配出棧序列。
  • 若目標值不在棧頂,繼續入棧直到匹配或耗盡。
  • 時間 O(N)、空間 O(N),N=10 極小。

測試用例

輸入序列輸出說明
1 2 3 4 5 6 7 8 9 10Yes順序入棧順序出棧
10 9 8 7 6 5 4 3 2 1Yes全入棧後逆序出棧
3 1 2 4 5 6 7 8 9 10No3 入棧後,1 在棧底無法先出
2 1 4 3 6 5 8 7 10 9Yes成對交換,合法

**= vs == 是 C/C++ 經典坑**。編譯器開啟 -Wparentheses (GCC) / /Wall (MSVC) 會警告「assignment used as truth value」。養成「常量在左 if (1 == r)」習慣可編譯期攔截。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved