向量(vector)
什么是向量?
向量是可以改变其大小的线性序列容器。
向量在内部使用动态分配数组的方式来存储元素,这表明在必要时会重新分配数组,以便在插入新元素时增大其容量。
向量的具体用法
添加头文件 #include
定义一个向量 vector name
返回当前向量是否为空 empty();
返回当前向量元素的个数 size();
尾部元素的添加 push_back();
尾部元素的删除 pop_back();
在任意位置插入元素 insert();
在任意位置删除元素 erase();
将向量清空 clear();
迭代器操作:返回向量中首元素的迭代器 begin(); 返回向量中尾元素后一个位置的迭代器end();
应用:完数和盈数
代码实现
#include<iostream>
#include<vector>
using namespace std;
int main() {
vector<int> numberE;
vector<int> numberG;
int sum;
for (int i = 2; i <= 60; i++) {
sum = 0;
for (int j = 1; j < i; j++) {
if (i % j == 0) sum += j;
}
if (sum == i) numberE.push_back(i);
else if (sum > i) numberG.push_back(i);
}
cout << "E:";
for (int i = 0; i < numberE.size(); i++) cout << " " << numberE[i];
cout<<endl;
cout << "G:" ;
for (int i = 0; i < numberG.size(); i++) cout << " " << numberG[i];
}
队列
什么是队列?
队列是一种线性的序列结构,操作受限。
新元素只能从队列的一端插入,并且只能从另一端删除已有元素。
允许队列插入的一端为队列的尾部,允许队列删除的一端为队列的头部。
先进先出
队列的用法
添加头文件#include
queue.empty();
queue.size();
queue.push();
queue.pop();
queue.front();
queue.back();
应用:约瑟夫问题
输入:
8 3 4
0 0 0
输出:
6,2,7,4,3,5,1,8
代码实现
#include<iostream>
#include<queue>
using namespace std;
int main(){
int n,p,m;
while(cin>>n>>p>>m){
queue<int> children;
if(n==0 && p==0 && m==0) break;
for(int i=1;i<=n;i++) children.push(i);
for(int i=1;i<p;i++){
children.push(children.front());
children.pop();
}
while(children.size()!=1){
for(int i=1;i<m;i++){
children.push(children.front());
children.pop();
}
cout<<children.front()<<",";
children.pop();
}
cout<<children.front();
}
}
应用 猫狗收容所
题目为先进先出,用队列实现。
如果只用一个队列,对于有选择地收养动物无法实现。
维护两个队列,一个用于存放猫,一个用于存放狗。
添加一个order判断哪个先进的收容所。
代码实现
#include<iostream>
#include<queue>
using namespace std;
struct animal{
int number;
int order;
animal(int x,int y){
number=x;
order=y;
}
};
int main(){
queue<animal> cats;
queue<animal> dogs;
int n,m,t;
int order=0;
cin>>n;
while(n--){
cin>>m>>t;
if(m==1 && t>0){
dogs.push(animal(t,order++));
}
else if(m==1 && t<0){
cats.push(animal(t,order++));
}
else if(m==2 && t==0){
if(cats.front().order<dogs.front().order){
cout<<cats.front().number<<" ";
cats.pop();
}
else{
cout<<dogs.front().number<<" ";
dogs.pop();
}
}
else if(m==2 && t==1){
cout<<dogs.front().number<<" ";
dogs.pop();
}
else if(m==2 && t==-1){
cout<<cats.front().number<<" ";
cats.pop();
}
}
}
栈
什么是栈?
栈是操作受限的线性表。
栈的操作仅限于逻辑上特定的一端,即新元素只能从栈的一端插入,也只能从这一端删除已有的元素。
栈中允许元素插入和删除的一端称为栈顶,禁止操作的盲端称为栈底。
后进先出。
栈的用法
添加头文件#include
定义一个栈stack name
stack.empty();
stack.size();
stack.push();
stack.pop();
stack.top();
应用:逆序输出
代码实现
#include<iostream>
#include<stack>
using namespace std;
int main(){
stack<int> num;
int m,n;cin>>n;
for(int i=0;i<n;i++){
cin>>m;
num.push(m);
}
for(int i=0;i<n;i++){
cout<<num.top()<<" ";
num.pop();
}
}
应用:括号匹配
括号匹配是栈的一个典型应用。
遍历整个字符串,遍历过程中遇到左括号,将其放入栈中。
遇到右括号,如果栈非空,则栈顶左括号与右括号匹配;如果栈空,则表明右括号匹配失败。
字符串遍历结束后,若栈非空,则栈中的左括号匹配失败。
题目描述
代码实现
#include<iostream>
#include<stack>
#include<string>
using namespace std;
int main(){
string str;
cin>>str;
stack<int> brackets;
string ans(str.size(),' ');
for(int i=0;i<str.size();i++){
if(str[i]=='(') brackets.push(i);
else if(str[i]==')'){
if(!brackets.empty()) brackets.pop();
else ans[i]='?';
}
}
while(!brackets.empty()){
ans[brackets.top()]='$';
brackets.pop();
}
cout<<str<<endl;
cout<<ans<<endl;
}
运行结果