You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Stack<pair<int,int>>合并重叠区间时的入栈错误问题

问题描述

我正在合并如下重叠区间:

5 12, 1 8, 14 19, 22 28, 25 27, 27 30

我采用pair<int, int>模板的逻辑,但无法将pair元素推入Stack<pair<int, int>>,因为我传入的是(&int, &int)而非(int, int),请问该如何解决?

附上我的代码:

#include <iostream>
#include <algorithm>
#include <vector>
#include <stack>
using namespace std;

void mergeOverlappingIntervals(vector<vector<int>> &arr) {
    vector<pair<int, int>> v;
    for(int i=0; i<arr.size(); i++) {
        v.push_back(make_pair(arr[i][0], arr[i][1]));
    }
    sort(v.begin(), v.end());
    // for(auto x:v) {
    //     cout << x.first << " " << x.second << endl;
    // }
    stack<pair<int, int>> st;
    st.push(v[0].first, v[0].second);
    for(int i=1; i<v.size(); i++) {
        int top = st.top();
        if(v[i].first <= top.second) {
            top.second = max(top.second, v[i].second);
        }
        st.push(v[i].first, v[i].second);
    }
    while(!st.empty()) {
        int top = st.top();
        cout << top.fist << " " << top.second << endl;
        st.pop();
    }
}

int main() {
    int n;
    cin >> n;
    vector<vector<int>> arr(n, vector<int>(2, 0));
    for(int i=0; i<n; i++) {
        cin >> arr[i][0];
        cin >> arr[i][1];
    }
    mergeOverlappingIntervals(arr);
    return 0;
}
解决方法

你的代码存在几处关键错误,导致无法正确将pair推入栈,以下是具体修正方案:

1. 栈push方法的参数错误

stack<pair<int, int>>的push()函数仅接受一个pair<int, int>类型参数,不能直接传入两个int值。你可以直接传入vector中已有的pair对象,或者用make_pair构造新pair:

  • 错误写法:st.push(v[0].first, v[0].second);
  • 正确写法:st.push(v[0]); 或 st.push(make_pair(v[0].first, v[0].second));

同理,循环内的st.push(v[i].first, v[i].second);也要改成st.push(v[i]);(后续还需调整该部分逻辑)。

2. 栈顶元素的类型声明错误

st.top()返回的是pair<int, int>&类型引用,不能赋值给int类型变量。需将top声明为pair<int, int>&,这样才能修改栈顶元素的区间范围:

  • 错误写法:int top = st.top();
  • 正确写法:pair<int, int>& top = st.top();

3. 合并区间的逻辑错误

当前代码不管区间是否重叠都会将当前区间推入栈,导致合并失败。正确逻辑是:若当前区间与栈顶区间重叠,就更新栈顶区间的右边界;若不重叠,再将当前区间推入栈。修改后的循环代码如下:

for(int i=1; i<v.size(); i++) {
    pair<int, int>& top = st.top();
    if(v[i].first <= top.second) {
        // 重叠时更新栈顶区间的右边界为较大值
        top.second = max(top.second, v[i].second);
    } else {
        // 不重叠时推入当前区间
        st.push(v[i]);
    }
}

4. 拼写错误

输出语句中的top.fist是拼写错误,应改为top.first。

修正后的完整代码
#include <iostream>
#include <algorithm>
#include <vector>
#include <stack>
using namespace std;

void mergeOverlappingIntervals(vector<vector<int>> &arr) {
    vector<pair<int, int>> v;
    for(int i=0; i<arr.size(); i++) {
        v.push_back(make_pair(arr[i][0], arr[i][1]));
    }
    sort(v.begin(), v.end());
    
    stack<pair<int, int>> st;
    st.push(v[0]);
    
    for(int i=1; i<v.size(); i++) {
        pair<int, int>& top = st.top();
        if(v[i].first <= top.second) {
            top.second = max(top.second, v[i].second);
        } else {
            st.push(v[i]);
        }
    }
    
    // 栈是后进先出结构,直接输出会得到逆序区间,转存到vector反转后输出可保证顺序正确
    vector<pair<int, int>> result;
    while(!st.empty()) {
        result.push_back(st.top());
        st.pop();
    }
    reverse(result.begin(), result.end());
    
    for(auto &interval : result) {
        cout << interval.first << " " << interval.second << endl;
    }
}

int main() {
    int n;
    cin >> n;
    vector<vector<int>> arr(n, vector<int>(2, 0));
    for(int i=0; i<n; i++) {
        cin >> arr[i][0];
        cin >> arr[i][1];
    }
    mergeOverlappingIntervals(arr);
    return 0;
}

额外说明:栈的特性是后进先出,直接输出栈内元素会得到逆序的合并区间,因此修正后的代码先将栈内元素转移到vector,反转后再输出,保证区间顺序从小到大排列。

内容的提问来源于stack exchange,提问作者codosopher

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 17:40:25