在第2节和本节中我们大致学习了数据结构中的线性表,栈,队列,以及二叉树。其中,我们学习了一种在c++中极其方便的使用这些数据结构的方式:利用STL容器,可以使用诸如stack、queue、vector等可以直接使用的数据结构类型,这对于我们学习算法以及编程知识都有很大好处。
以下是我对团队作业部分内容的题解。
1.洛谷p3156—询问学号
集训队团队作业——线性表
//询问学号
#include<iostream>
using namespace std;
int a[2000010]={0};
int main()
{
int n,m;
cin >> n >> m;
for(int i = 1 ; i <= n ; i++)
cin >> a[i];
int temp;
for(int i = 1 ; i <= m ; i ++)
{
cin >> temp;
cout << a[temp] << endl;
}
return 0;
}
询问学号
///*(STL容器):用STL容器里的vector(可变数组(向量))实现*/
//#include<iostream>
//#include<vector>
//
//using namespace std;
//
//int main()
//{
// vector<int>a;
// int n , m;
// cin >> n >> m;
// int temp;
// for(int i = 0 ; i < n ; i++)
// {
// cin >> temp;
// a.push_back(temp);
// }
// for(int i = 0 ; i < m ; i++)
// {
// cin >> temp;
// cout << a[temp - 1] << endl;
// }
//
// return 0;
//}
2.洛谷p1449—后缀表达式
//后缀表达式
#include<iostream>
#include<stack>
#include<string>
using namespace std;
stack<long long>st;
string s;
int main()
{
cin >> s;
int num = 0;
int x = 0 , y = 0;
for(int i = 0 ; i < s.size()-1 ; i++)
/*i < s.size()-1 ,最后一位是@,用
i < s.size()-1 可以屏蔽@*/
{
if(s[i] >= '0' && s[i] <= '9')
num = num*10 + s[i] - '0';
/*将字符型数字转化为整形
如字符串13,转换为整形13*/
else if(s[i] == '.')
{
st.push(num);
num = 0;
}
else
{
switch(s[i])
{
case '+' :{
x = st.top() ; st.pop() ; y = st.top() ; st.pop() ;
st.push(y + x);
break;
}
case '*' :{
x = st.top() ; st.pop() ; y = st.top() ; st.pop() ;
st.push(y * x);
break;
}
case '-' :{
x = st.top() ; st.pop() ; y = st.top() ; st.pop() ;
st.push(y - x);
break;
}
case '/' :{
x = st.top() ; st.pop() ; y = st.top() ; st.pop() ;
st.push(y / x);
break;
}
}
}
}
cout << st.top();
return 0;
}
3.洛谷p1540—机器翻译
//机器翻译
#include<iostream>
using namespace std;
int a[1010] = {0};
int b[1010] = {-1};
int main()
{
int m , n;
cin >> m >> n;
int i,j,k;
int temp;
int begin = 0 , num = 0;
int ans = 0;
for(i = 0 ; i < n ; i++)
{
cin >> temp;
for(j = begin ; j <= num ; j++)
{
if(b[j] == temp) break;
}
if(j >= num)
{
ans++;
b[num] = temp;
num++;
if(num > m) begin++;
}
}
cout << ans;
return 0;
}