顺序表ADT模板简单应用算法设计:在给定的有序顺序表中找出两个元素和为给定值的所有元素对
时间限制: 1s
类别: DS:线性表->顺序表--简单
问题描述
目的:使用自行设计的顺序表ADT或STL的vector模板设计并实现顺序表应用场合的一些简单算法设计。
应用7:试设计一个算法,找出有序顺序表A(顺序表A中的数据元素的数据类型为int型,非空表,且无重复值)中两个元素和为给定值sum的所有元素对,并保持原顺序表不变。
(1)顺序表ADT版本
参考函数原型:
template<class ElemType>
void Search_Pairs( const SqList<ElemType> &A, int sum );
(2)vector版本
参考函数原型:
template<class ElemType>
void Search_Pairs( const vector<ElemType> &A, int sum );
输入说明
第一行:有序顺序表A的数据元素(数据元素之间以空格分隔)
第二行:给定值sum
输出说明
第一行:顺序表A的遍历结果数据元素之间以“,”分隔)
第二行开始:符合条件的元素对(输出格式见测试数据范例)
如无符合条件的元素对,输出"NULL"
#include <iostream>
#include <vector>
#include <sstream>
using namespace std;
template<class ElemType>
void Search_Pairs(const vector<ElemType> &A, int sum)
{
int left = 0, right = A.size() - 1;
vector<pair<ElemType, ElemType>> pairs;
while (left < right)
{
int currentSum = A[left] + A[right];
if (currentSum == sum)
{
pairs.emplace_back(A[left], A[right]);
left++;
right--;
}
else if (currentSum < sum)
{
left++;
}
else
{
right--;
}
}
for (size_t i = 0; i < pairs.size(); i++)
{
cout << "(" << pairs[i].first << "," << pairs[i].second << ")";
if (i < pairs.size() - 1)
{
cout << ",";
}
}
if (pairs.empty())
{
cout << "NULL";
}
}
int main()
{
vector<int> A;
int sum, temp;
string line;
getline(cin, line);
istringstream iss(line);
while (iss >> temp)
{
A.push_back(temp);
}
cin >> sum;
// 打印顺序表A
for (size_t i = 0; i < A.size(); i++)
{
cout << A[i];
if (i < A.size() - 1) cout << ",";
}
cout << endl<<endl;
Search_Pairs(A, sum);
return 0;
}