向量——长度不定的数组
vector
1.构造
int a[]={1,2,3,4,5};
vector<int> V1;
vector<int> V2(a,a+5);
vector<int> V3(5,2);
vector<int> V4(V2);
vector<int> V5(V4.begin(),V4.begin()+3);
2.操作
int n=V2.size();
V2.pop_back();
V2.push_back(6);
V2.insert(V2.begin()+1,9);
V2.insert(V2.begin(),3,7);
V2.erase(V2.begin()+2);
V2.clear();
队列
入队
出队
判空
访问队首
#include<iostream>
#include<cstdio>
#include<string>
#include<queue>
using namespace std;
int main()
{
queue<int> myQueue;
for(int i=0;i<10;++i)
{
myQueue.push(i);//入队
}
int sum=0;
while(!myQueue.empty())
{
sum+=myQueue.front();
myQueue.pop();
}
printf("%d\n",sum);
return 0;
}
例题——猫狗收容所
#include<iostream>
#include<cstdio>
#include<string>
#include<queue>
using namespace std;
struct Animal{
int number;
int order;
Animal(){}
Animal(int n,int o):number(n),order(o){}
};
queue<Animal> cats;
queue<Animal> dogs;
int main()
{
int n;
scanf("%d",&n);
int order=0;
for(int i=0;i<n;++i)
{
int method,type;
scanf("%d%d",&method,&type);
if(method==1)
{
if(type>0)
{
dogs.push(Animal(type,order));
}else
{
cats.push(Animal(type,order));
}
}else
{
if(type==0&&!dogs.empty()&&!cats.empty())
{
if(dogs.front().order<cats.front().order)
{
printf("%d ",dogs.front().number);
dogs.pop();
}else
{
printf("%d ",cats.front().number);
cats.pop();
}
}else if(type==0&&!dogs.empty()&&cats.empty())
{
printf("%d ",dogs.front().number);
dogs.pop();
}else if(type==0&&dogs.empty()&&!cats.empty())
{
printf("%d ",cats.front().number);
cats.pop();
}else if(type==1&&!dogs.empty())
{
printf("%d ",dogs.front().number);
dogs.pop();
}else if(type==-1&&!cats.empty())
{
printf("%d ",cats.front().number);
cats.pop();
}
}
}
printf("\n");
return 0;
}
栈
stack<int> myStack;
for(int i=0;i<10;++i)
{
myStack.push(i);
}
int sum=0;
while(!myStack.empty())
{
printf("%d ",myStack.top());
sum+=myStack.top();
myStack.pop();
}
printf("\n%d\n",sum);
栈的应用
1.逆序输出——后进先出
2.括号匹配
#include<iostream>
#include<cstdio>
#include<string>
#include<stack>
using namespace std;
int main()
{
string str;
while(cin>>str)
{
stack<int> brackets;
string answer(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
{
answer[i]='?';
}
}
}
while(!brackets.empty())
{
answer[brackets.top()]='$';
brackets.pop();
}
cout<<str<<endl;
cout<<answer<<endl;
}
return 0;
}
3.表达式求值
#include<iostream>
#include<cstdio>
#include<cctype>
#include<string>
#include<stack>
using namespace std;
int Priority(char c)
{
if(c=='#'){
return 0;
}else if(c=='$'){
return 1;
}else if(c=='+'||c=='-'){
return 2;
}else{
return 3;
}
}
double GetNumber(string str,int& index)
{
double number=0;
while(isdigit(str[index]))
{
number=number*10+str[index]-'0';
index++;
}
return number;
}
double Calculate(double x,double y,char op)
{
double result=0;
if(op=='+')
{
result=x+y;
}else if(op=='-')
{
result=x-y;
}else if(op=='*')
{
result=x*y;
}else if(op=='/')
{
result=x/y;
}
return result;
}
int main()
{
string str;
while(getline(cin,str))
{
if(str=="0")
{
break;
}
int index=0;
stack<char> oper;
stack<double> data;
oper.push('#');
str+='$';
while(index<str.size())
{
if(str[index]==' ')
{
index++;
}else if(isdigit(str[index]))
{
data.push(GetNumber(str,index));
}else
{
if(Priority(oper.top())<Priority(str[index]))
{
oper.push(str[index]);
index++;
}else
{
double y=data.top();
data.pop();
double x=data.top();
data.pop();
data.push(Calculate(x,y,oper.top()));
oper.pop();
}
}
}
printf("%.2f\n",data.top());
}
return 0;
}